2010-06-25 68 views
2

我一直在看一些代码,并且很难在php类中处理变量声明。具体来说,我看到的代码在使用它们之前没有声明类变量。现在可以预料到这一点,但我找不到任何可能的信息。所以你会期待这个:在PHP中隐式类变量声明?

class Example 
{ 

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

    } 

} 

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

回答

3

这个工作同样作为一个正常的变量声明将工作:

$foo = 'bar'; // Created a new variable 

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

PHP类是不太一样的其他语言,其中的成员变量需要被指定为类声明的一部分。 PHP类成员可以随时创建。

说了这么多,你应该声明变量像public $foo = null;在类的声明,如果它应该是类的常任理事国,清楚地表达意图。

2

所以你会期望:(代码示例)工作?
是的。这是非常糟糕的做法(至少它让我的C++皮肤爬行),但它丝毫不会让我感到惊讶。有关使用另一个而未事先声明的示例,请参见下面的示例2。 http://www.php.net/manual/en/language.oop5.basic.php如果启用E_STRICT,它将引发错误。

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

是的。不是PHP的乐趣?来自C++/C#的背景,PHP花了一段时间用它非常宽松的打字来增长我,但它有它的优势。

+0

这第二个例子是关于调用使用'$ this'静态,不是成员变量的方法。 – deceze 2010-06-25 02:20:05

+0

查看第二个例子中的B类。 – Caladain 2010-06-25 02:34:20

+0

是的,我做到了。它调用'A :: foo()'。这里根本没有成员变量。 – deceze 2010-06-25 02:42:15

1

这是完全有效的,但意见不同。由于类成员变量的创建在构造函数中,因此它们将存在于对象的每个实例中,除非被删除。

这是传统与信息注释来声明类成员变量:

class Example 
{ 
    private $data; // array of example data 

    private $var; // main state variable 

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

应该指出,原来的例子会导致公众成员,而你的例子有私人成员。 – 2016-11-08 18:52:59