未定义时在类对象中调用的变量?

时间:2017-08-24 14:08:36

标签: php class object

我已经开始真正深入了解其他人的代码,我希望这被认为是一个简单的问题,但有些东西让我失望,希望你能解释一下:

当读取这个简单的启动脚本到模板引擎时,我注意到没有为$ variable->对象设置定义或变量。

class Template {
protected $file;
protected $values = array();

public function __construct($file) {
    $this->file = $file;
   }
}

如果您在上面的基本代码中注意到$ this-> file = $ file,则会引用“file”对象而不会定义它。它是__construct函数的原因吗?还是我错过了别的什么?如果是这样,所有构造变量在函数中设置为“define()”吗?

编辑:

问题是,__construct是否作为一个define()使得“file”可以在代码中的任何地方使用,就像它是一个变量$ file一样?或者“受保护”基本上定义了变量$ file,允许我使用变量$ file。但如果是这样的话,

怎么来

function __construct($file)  

看起来不像:

function __construct(file) if that is the case?

猜猜我对如何调用“文件”以及代码的哪个部分定义为“文件”感到困惑?

1 个答案:

答案 0 :(得分:1)

$file属性在您的班级中定义:

class Template {
protected $file; // <-- HERE
protected $values = array();

无论如何,定义属性不是强制性的。在PHP中,您可以为对象的属性赋值,即使它没有在类中定义。

然而,这是一种不正常的工作方式,这有两个原因:

  • 如果您使用未定义的属性,那么对于查看您的类的人来说,他们无法知道使用了这样的属性,因为它没有记录。
  • 定义属性允许您指定访问修饰符public如果必须可以从任何位置访问该属性private,如果它必须仅从类本身可用,和protected是否必须从其类本身或任何扩展它的类访问它。 如果您定义没有访问修饰符的属性,则默认情况下它将是公共的。如果你根本没有定义这个属性,它将是相同的,但是没有更多的线索来弄清楚发生了什么。

如果您打算使用或维护您的代码的开发人员想要杀死您,只使用未定义的属性,因为我可以保证他们愿意。