我现在尝试了12个多小时,我真的很沮丧,因为它不起作用。
我有两个类Book
和Comment
。每本书都有多条评论。我想返回一本特定的书及其n条评论。为此,我创建了两个类,因为每个类都应该有额外的操作,如添加,删除,更新等。
我的问题是,当我从book类的非静态函数调用Comment类中的静态函数时,它不起作用:
$result = Comment::GetCommentByBookId($id);
奇怪的是,当我将Comment类中的静态函数GetCommentByBookId
更改为非静态函数,并将GetBookById函数中的行更改为
$c = new comment;
$result = $c->getCommentByBookId(1);
它工作!但是为什么当我尝试调用静态函数时它不工作?
这些是类:
预订
<?php
require_once ("class/DBController.php");
require_once ("class/Comment.php");
class Book {
private $db_handle;
function __construct() {
$this->db_handle = new DBController();
}
function GetBookById($id) {
$query = "SELECT * FROM book WHERE id = ?";
$paramType = "i";
$paramValue = array(
$id
);
$c = new comment;
$result = $c->getCommentByBookId(1);
//$result = Comment::GetCommentByBookId($id);
return $result;
}
function GetAllBooks() {
$query = "SELECT * FROM book";
$result = $this->db_handle->runBaseQuery($query);
return $result;
}
}
?>
留言
<?php
require_once ("class/DBController.php");
class Comment {
private $db_handle;
function __construct() {
$this->db_handle = new DBController();
}
static function GetCommentByBookId($id) {
echo "Entered 'GetCommentByBookId'<br>";
$query = "SELECT * FROM comment WHERE book_id = ?";
$paramType = "i";
$paramValue = array(
$id
);
echo "Pre-Ex 'GetCommentByBookId'<br>";
$result = $this->db_handle->runQuery($query, $paramType, $paramValue);
echo "Executed successfully 'GetCommentByBookId'<br>";
return $result;
}
}
?>
2条答案
按热度按时间ars1skjm1#
如果你没有示例化一个Comment示例,你就不能访问$this-〉db_handle。
你可以考虑像下面这样做:
a6b3iqyw2#
**问题:**但是为什么调用静态函数不起作用?
**答案:**因为当你调用类外的静态方法时,该类的构造不会运行,因此如果你调用依赖于构造类的任何其他属性,你会得到错误。
在你的例子中,当你在静态方法中调用
static function GetCommentByBookId($id)
时,你现在调用的是$result = $this->db_handle->runQuery($query, $paramType, $paramValue);
,因为构造没有运行,因此当你调用静态方法时,this->handle
没有示例化这个类,因此你得到了$this->db_handle->runQuery
的错误。示例
我已经重建了你的代码,你解释我的意思。请看一下代码和结果图像。
如果您有任何疑问/问题或发现不正确的东西,请评论。