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->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 类中的变量是如何分配的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章