我正在努力复习一些面向对象的基础知识。我写了这个简单的剧本,但很困惑为什么它会这样。
class Foo
{
function run($text = null)
{
$this->bar = strtolower($text);
echo $this->bar;
}
}
$foo = new Foo;
$foo->run('THIS IS SOME TEXT IN LOWER CASE');
脚本按预期输出"这是一些小写文本"。
但我感到困惑的是,为什么我可以在不实际声明$bar
变量的情况下执行此操作。为什么我只能使用$this->bar
?也许我不理解$this
是如何正常工作的,但我一直认为在类中使用变量之前必须声明它。例如public $bar;
感谢您的任何见解。
PHP将自动将对象变量声明为公共变量,如果您在访问对象变量时没有将其声明为类成员。这不是魔法,只是一个"功能";)
然而,一个好的设计不应该使用这个"特性",而应该显式地声明任何类成员。你的课应该是这样的:
class Foo
{
/**
* some description
*
* @var <type>
*/
protected $bar;
...
function run($text = null)
{
$this->bar = strtolower($text);
echo $this->bar;
}
}
您可以在类(也称为属性)中声明变量,如下所示:
class Foo {
public $bar;
}
注意public
关键字。在这里,我们声明属性的可见性。可见性有三种类型:public
、private
和protected
。
- public:您可以在任何地方访问该房产
- private:您只能访问在中声明的类中的属性
- protected:您只能访问在AND任何子类中声明的类中的属性
这也适用于方法。我不想说太多细节,但你可以在这里阅读更多。
如果你没有声明一个属性,而是像你在例子中那样在方法中设置了一个,PHP会自动为你声明它,并分配你指定的值。
您应该看看http://php.net/manual/en/language.oop5.magic.php
考虑到在对象外声明以前不存在的变量的方式,在对象内部也会发生同样的情况,因为它们是类型不正确的。
您需要将protected
或private
放在类方法之外的变量前面,才能将类变量声明为除public
之外的任何变量。在PHP中,赋值是声明,如果它还没有声明的话。注意,你也可以这样做:
$ary = array('a', 'b', 'c', 'd');
foreach($ary as $v){
$newArray[] = $v;
}
注意,我从未在循环之前声明过$newArray = array();
。