我学习了一些OO PHP,但我遇到的文档显示了以下示例中的几种方法。我很困惑为什么两者都有效,哪些应该专门使用。
我知道#1不是OOP但我仍然对第二种echo方法感到好奇,是否应该使用它。
以下两个echo
都打印“Lansana”,但是一个在回声之前初始化$name
,而另一个在回声之后(或期间)初始化它。
<?php
$name = "Lansana";
echo $name;
echo $name = "Lansana";
?>
请注意第一个示例中的公共属性$name
没有值,第二个示例中没有公共属性,但两者仍然相同。
class Pets
{
public $name;
public function __construct($name) {
$this->name = $name;
}
}
$dog = new Pets("Buddy");
echo $dog->name;
class Pets
{
public function __construct($name) {
$this->name = $name;
}
}
$dog = new Pets("Buddy");
echo $dog->name;
#1和#2中的首选方法是什么?为什么?我不知道为什么文档显示了第一类方法,因为我没有看到那里需要公共财产,但是我又知道了什么。
答案 0 :(得分:2)
我想我应该对上面评论中概述的内容给出更多背景信息。
对于第一个示例,尽量不要在同一语句中混合赋值和输出。虽然它在语法上是正确的,但它并不能立即表明该语句的意图。
对于第二个例子,我在评论中明确定义属性总是更可取的。优点是:
您在OO PHP中看到的最常见错误之一是您静默创建属性,例如:
class A {
public function setUserId($id){
$this->userId = $id;
}
public function getUserId(){
return $this->userid;
}
}
这里的意图很清楚,但你必须非常密切关注引用的属性是否有所不同。如果你输入另外50行代码并且同时在屏幕上没有两个属性引用变得更难。
关于PHP的使用魔法__get和__set方法有助于在开发早期消除这个问题。示例:
class A {
public $foo;
public $bar;
public function __set($prop, $val){
throw new Exception ($prop." does not exist on this object");
}
public function __get($prop){
throw new Exception ($prop." does not exist on this object");
}
}
这使得如果您尝试访问未定义的属性,该类将抛出异常,让您确切知道发生了什么以及在哪里。
答案 1 :(得分:1)
我认为#1只是一个捷径。 #2是因为重载,其中类变量是动态创建的。
http://www.php.net/manual/en/language.oop5.overloading.php
至于首选方法,#1'echo $ name ='Something'更多的是捷径,而不是不同的方法。在任何一种情况下,最终结果都是相同的。
对于#2,动态创建的变量通常不是一个好主意,因为它可以产生一些意想不到的结果,但它们确实有它们的位置。请查看上面的链接,了解使用重载的代码示例。第一种方法很受欢迎。
答案 2 :(得分:1)
echo $name = "Lansana";
PHP将其解释为
echo ($name = "Lansana");
echo类似于函数,因为php在将其发送到标准输出之前解释了echo右侧的所有内容。
第一个肯定是最好的方式。因为PHP是一种动态语言(而不是像C#或Java 这样的静态语言),它允许创建和设置变量而不首先声明它们。总是声明类变量是最好的 - 它使代码更容易阅读和维护。