【问题标题】:Variable called in class object when not defined?未定义时在类对象中调用的变量?
【发布时间】:2017-08-24 14:08:35
【问题描述】:

我已经开始真正深入研究其他人的代码,我希望这被认为是一个简单的问题,但有些事情让我感到厌烦,我希望你能解释一下:

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

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

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

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

编辑:

问题是,__construct 是否充当 define() 以便“文件”可以在代码中的任何位置使用,就好像它是一个变量 $file?或者是“受保护”本质上定义了变量 $file,允许我使用变量 $file。但如果是这样的话,

怎么来的

function __construct($file)  

看起来不像:

function __construct(file) if that is the case?

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

【问题讨论】:

  • 但一般是可以的,但不干净
  • 我不知道这里的“未定义”是什么。 protected $file 定义了 $this->file 引用的属性。 $file 作为参数进入函数。
  • @deceze 所以只要 $this->file 被引用,protect $file 就允许全局使用“file”。我的困惑是“文件”如何在没有被定义的情况下首先存在。本质上如何使用“文件”?
  • $this->file,不是file,是指之前定义的protected $file

标签: php class object


【解决方案1】:

$file 属性在您的类中定义:

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

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

但是,这是一种很丑陋的工作方式,原因有二:

  • 如果您使用未定义的属性,那么查看您的类的人无法知道使用了此类属性,因为它没有记录在案。
  • 定义一个属性允许你指定一个访问修饰符public如果该属性必须可以从任何地方访问,private如果它只能从类本身获得,@987654325 @ 如果必须从其类本身或任何扩展它的类访问它。 如果您定义没有访问修饰符的属性,则默认情况下它将是公共的。如果您根本不定义该属性,它会是相同的,但用于弄清楚发生了什么的线索会更少。

如果您打算让负责使用或维护您的代码的开发人员想要杀死您,请仅使用未定义的属性,因为我可以向您保证,他们会这样做。

【讨论】:

  • 在这种情况下如此受保护的行为与define()相同吗?因此,通过整个类,我可以简单地键入文件,并且该类将知道引用受保护的 $file?
  • 我想我明白了,所以 $this->file 本质上是在引用 template->file ,或者换句话说 class->variable 在这种情况下?并且 $file 是由正确启动类的代码设置的吗?如果是这种情况,构造中的变量需要什么?
  • @DEVPROCB 传递给__constrruct()$file 用于设置$this-&gt;file
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多