PHP 类中的变量是如何分配的? [复制]

Posted

技术标签:

【中文标题】PHP 类中的变量是如何分配的? [复制]【英文标题】:How are variables assigned in PHP classes? [duplicate] 【发布时间】:2016-11-28 05:16:07 【问题描述】:

我在codeacademy 中做了一个与 php 中的对象相关的练习。它要求我在 Cat 类中定义一个公共变量 $name

    <?php
        class Cat 

            public $isAlive = true;
            public $numLegs = 4;
            public $name;

            public function __construct( $name )  
                $this->name = $name;
            

            public function meow() 
                return "Meow meow. " . $this->name . "<br>";
            
        

        $cat1 = new Cat( "CodeCat" );
        echo $cat1->meow();

    ?>

public $name; 行真的需要吗?据我了解,我用参数值CodeCat 调用特殊函数__construct。然后这个CodeCat 被分配给变量$this-&gt;name,这就是我稍后在函数meow 中使用的。如果我注释掉public $name; 行,那么这不会影响结果。

【问题讨论】:

【参考方案1】:

public $name; 行真的需要吗? ...如果我注释掉 public $name; 行,那么这不会影响结果。

PHP 将根据请求在您的对象上创建属性,即使您从未正式声明它们。

Class Thing
$a = new Thing();
$a->name = 'John';
echo $a->name; // John
echo $a->age; // doesn't break script but PHP gives 'Notice: undefined property'

Run it here

因此,您的代码会以任何一种方式运行,因为当您将 name 属性设置为 __construct() 中的某个内容时,PHP 添加了该属性。由于默认情况下属性是公开的,因此您会得到相同的结果。

这种代码设计(使用属性而不声明它们)是一个不好的习惯,原因包括:

对于想要使用您的代码或与您的代码交互的其他人来说,这是一场噩梦 如果您处理的不仅仅是一个非常简单的脚本,那对您来说就是一场噩梦。在大型应用程序中,不可能知道 Cat 的这个实例有名称吗?这个实例呢?它还有哪些其他属性有吗? 如果您跨不同的函数,或者更糟糕的是,不同的文件动态添加属性,这些都不是容易回答的。 调用代码并不能保证某个属性存在,因此您的程序可能会有更多错误 IDE 和代码编辑器无法知道对象的形状,因此您无法使用强大的工具。您的脚本将需要更长的时间来编写

【讨论】:

【参考方案2】:

公共变量允许您直接将它们修改为字段,而不是通过公共方法。添加以下行:

    $cat1 = new Cat( "CodeCat" );
    echo $cat1->meow();

    $cat1->name = "Another Cat";
    echo $cat1->meow();

你会看到:

Meow meow. CodeCat<br>
Meow meow. Another Cat<br>

即使在构造之后,您也可以更改 $name 的值。

拥有私有财产:

将 $name 的访问器从 public 更改为 private,你会得到这个错误:

Fatal error: Cannot access private property Cat::$name

当试图从 $cat1 对象中为其分配一个值时。

【讨论】:

以上是关于PHP 类中的变量是如何分配的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将函数的结果分配给 PHP 类中的变量? OOP 怪异

如何删除 PHP 生成 css 类中的空格? [复制]

如何从同一项目中的另一个类访问主类中的变量? [复制]

如何将另一个文件中的变量分配给类常量?

类中声明的变量的内存分配

PHP类:全局变量作为类中的属性