简单的PHP面向对象$this


Simple PHP Object-Oriented $this

我正在努力复习一些面向对象的基础知识。我写了这个简单的剧本,但很困惑为什么它会这样。

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关键字。在这里,我们声明属性的可见性。可见性有三种类型:publicprivateprotected

  • public:您可以在任何地方访问该房产
  • private:您只能访问在中声明的类中的属性
  • protected:您只能访问在AND任何子类中声明的类中的属性

这也适用于方法。我不想说太多细节,但你可以在这里阅读更多。


如果你没有声明一个属性,而是像你在例子中那样在方法中设置了一个,PHP会自动为你声明它,并分配你指定的值。

您应该看看http://php.net/manual/en/language.oop5.magic.php

考虑到在对象外声明以前不存在的变量的方式,在对象内部也会发生同样的情况,因为它们是类型不正确的。

您需要将protectedprivate放在类方法之外的变量前面,才能将类变量声明为除public之外的任何变量。在PHP中,赋值是声明,如果它还没有声明的话。注意,你也可以这样做:

$ary = array('a', 'b', 'c', 'd');
foreach($ary as $v){
  $newArray[] = $v;
}

注意,我从未在循环之前声明过$newArray = array();