【问题标题】:How are variables assigned in PHP classes? [duplicate]PHP 类中的变量是如何分配的? [复制]
【发布时间】: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; 行,那么这不会影响结果。

【问题讨论】:

    标签: php


    【解决方案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 对象中为其分配一个值时。

      【讨论】:

        猜你喜欢
        • 2012-10-17
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        • 2013-05-23
        • 2014-01-28
        • 2019-07-21
        • 1970-01-01
        相关资源
        最近更新 更多