【发布时间】:2016-09-08 18:26:08
【问题描述】:
我正在阅读一本关于在 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 开发人员,我认为,他们在类中声明的几乎所有其他方法中都犯了同样的错误 (?)。
那么,PHP 是否可以在不使用 $this-> 的情况下调用属性?它是否与 php.ini 中的配置行(或类似的东西)有关?可能是因为使用的是旧版本的PHP。
【问题讨论】:
-
查看本书的网站,看看是否有勘误表。我很确定如果不使用
$this,就无法访问属性。对于来自 C++ 的人来说,这是一个常见的错误。 -
在属性和方法名称前加上下划线是区分私有属性/方法与公共属性/方法的一种约定(没有下划线)。知道这是哪本书会很有趣
-
你确定你复制的函数正确吗?我想知道为什么这个函数会被命名为
getClassMethods(),但它返回的是$_properties而不是$_methods。 -
这本书得到的大多是负面评论,尽管没有人提到代码有这么多错误。 Apress 网站有一个地址,您可以在其中提交勘误表,如果您觉得受到启发。
-
你对这本书的看法可能是对的(它有点糟糕)。这很令人沮丧,因为理解 MVC 并构建 MVC 框架似乎真的很好:/
标签: php oop properties