如何在PHP类中分配变量?


How are variables assigned in PHP classes?

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    <?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 ."";
            }
        }

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

    ?>

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


Is this public $name; line actually needed? ... If I comment out the
public $name; line, then this does not affect the result.

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

1
2
3
4
5
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'

在这里运行

所以您的代码以任何方式运行,因为当您将其设置为__construct()中的某个内容时,php会添加name属性。因为属性在默认情况下是公共的,所以您得到相同的结果。

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

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

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

1
2
3
4
5
    $cat1 = new Cat("CodeCat" );
    echo $cat1->meow();

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

你会看到:

1
2
Meow meow. CodeCat
Meow meow. Another Cat

您甚至可以在构造之后更改$name的值。

私人财产:

将$name的访问器从public更改为private,将出现以下错误:

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

当试图从$cat1对象给它赋值时。