【问题标题】:implicit class variable declaration in php?php中的隐式类变量声明?
【发布时间】:2023-12-22 00:12:02
【问题描述】:

我一直在查看一些代码,并且很难在 php 类中进行变量声明。具体来说,我正在查看的代码似乎没有在使用类变量之前声明它们。现在这可能是意料之中的,但我找不到任何表明这是可能的信息。所以你会期待吗:

class Example
{

    public function __construct()
    {
        $this->data = array();
        $this->var = 'something';

    }

}

上班?这是否会在以后使用的类实例上创建这些变量?

【问题讨论】:

    标签: php class variables declaration


    【解决方案1】:

    这与普通变量声明的工作方式相同:

    $foo = 'bar'; // Created a new variable
    
    class Foo {
        function __construct() {
            $this->foo = 'bar'; // Created a new variable
        }
    }
    

    PHP 类与其他语言中的类并不完全相同,其中成员变量需要指定为类声明的一部分。 PHP 类成员可以随时创建。

    话虽如此,你应该在类声明中声明像public $foo = null;这样的变量,如果它应该是类的永久成员,以清楚地表达意图。

    【讨论】:

      【解决方案2】:

      那么您希望这个:(代码示例)能够工作吗?
      是的。这是非常糟糕的做法(至少它让我的 C++ 皮肤爬行),但丝毫不会让我感到惊讶。有关使用另一个 class 而不事先声明它的示例,请参见下一页中的示例 2。 http://www.php.net/manual/en/language.oop5.basic.php E_STRICT 开启会报错。

      这是否会在类实例上创建这些变量以供以后使用?

      是的。 PHP 不是很有趣吗?来自 C++/C# 的背景,PHP 花了一些时间在我身上成长,因为它的类型非常松散,但它有它的优势。

      【讨论】:

      • 第二个例子是关于调用一个静态使用$this的方法,而不是关于成员变量。
      • 看第二个例子中的B类。
      • 是的,我做到了。它正在调用A::foo()。那里根本没有成员变量。
      • 类,成员变量..对PHP都一样。这就是我想要展示的。 -.-
      • 我认为你误解了这个例子。一个类在任何范围内都是自动可用的,这并不奇怪。并且类“预先声明的”,否则你不能使用它。该示例只是静态调用类方法。没有什么需要声明的,就像调用任何其他方法一样。重点是演示特殊变量$this 在静态调用时、作为对象的一部分以及从另一个对象静态调用时在方法中的行为。 E_STRICT 是通过在 A::foo() 中使用 $this 生成的,而不是因为“使用了类”。
      【解决方案3】:

      这完全是功能性的,尽管意见会有所不同。由于类成员变量的创建是在构造函数中,所以除非被删除,否则它们将存在于对象的每个实例中。

      通常使用信息丰富的 cmets 声明类成员变量:

      class Example
      {
          private $data;  // array of example data
      
          private $var;   // main state variable
      
          public function __construct()
          {
              $this->data = array();
              $this->var = 'something';
          }
      }
      

      【讨论】:

      • 需要注意的是,原来的例子会产生公有成员,而你的例子有私有成员。