我正在阅读一本关于在PHP中创建MVC框架的书。在第二章中,我们构建了一个有点奇怪的类。让我用一个例子来解释。
该类名为Inspector
。以下是属性:
protected $_class;
protected $_properties = array();
protected $_methods = array();
protected $_meta = array(
"class" => array(),
"properties" => array(),
"methods" => array()
);
正如您所看到的,它们都被声明为受保护的。
但是现在,这是该课程的众多方法之一:
public function getClassMethods()
{
if (!isset($_methods))
{
$methods = $this->_getClassMethods();
foreach ($methods as $method)
{
$_methods[] = $method->getName();
}
}
return $_properties;
}
_getClassMethods()
是一个在上面声明了几行的方法,但对我们的例子来说并不重要。
显然,$_methods
是先前声明的属性。但是为什么它之前没有$this->
?首先,我认为这是因为该属性被声明为protected
,但我做了一些测试,看它是否正常并且正常工作,但当然它引发了一个错误。
我无法相信错误来自本书:我认为编写者是专业的PHP开发人员,他们在类中声明的所有其他方法中也犯了同样的错误(?)。 / p>
那么,PHP是否可以在不使用$this->
的情况下调用属性?它是否与php.ini中的配置行(或类似的东西)有关?也许是因为它是使用过的旧版PHP。
答案 0 :(得分:3)
在您的函数中,$_methods
和$this->_methods
将是两个不同的变量/属性。
要访问protected $_methods
媒体资源,您需要使用$this->_methods
。这可以在班级的任何方法中使用。
如果你只使用$_methods
,那么你正在创建/访问一个只存在于该方法中的变量,并在方法执行完毕后消失。
因此,本书不正确,您的需要 使用$this->_methods
和$this->_properties
。