PHP相当于Ruby的@instance_variable?

时间:2010-10-11 16:11:50

标签: php ruby this instance-variables

我想知道在PHP中分配和使用类变量是否有更短,更好或更清晰的方式,然后通过$this->instance_variable

class Bar {
  #  internal variables
  var $foo = "Hello World";

  public function foo() {
    return $this->foo;
  }
}

我对PHP的所有变量范围都不是很熟悉,但根据我在官方文档中的理解,您可以将它们定义为全局,也可以通过$this->访问它们? 是否有关键字将它们定义为实例变量,因此它们可以像Rubys @variable一样访问?

3 个答案:

答案 0 :(得分:4)

你从Ruby中带来的一些关键假设并没有很好地转化为PHP。

在PHP中声明和使用对象属性(相当于Ruby的实例变量)的正确方法是

class Foo
{
    //accesible from inside this objects of this class, 
    //objects that have this class as an ancestor, and from
    //outside the object  
    //var $bar; is equivalent.  "var" is PHP 4 syntax, 
    //when everything was public
    public $bar;

    //accesible from inside this objects of this class, 
    //objects that have this class as an ancestor  
    protected $baz;

    //accesible from inside this objects only
    private $fiz;

    protected function example()
    {
        echo $this->bar . "\n";
        echo $this->baz . "\n";
        echo $this->fiz . "\n";
    }
}

PHP的OO语法基于世界的Java / C#视图。但是,因为每个PHP页面/脚本/程序都在全局分数中开始,所以需要对本地对象的$this伪引用。没有它,你会在这样的情况下产生很大程度的歧义

//In main.php
$foo = "bar";
include('example.php');

//in example.php
class Example
{
    public $foo="baz";
    public function scopeIsHardLetsGoShopping()
    {
        global $foo;
        echo $foo;
    }
}

那么,在方法中,引用的$ foo应该是对象变量还是全局变量?如果你说它应该是对象变量,你如何从方法中访问全局foo?如果你说它应该是全局变量,你如何在声明具有相同名称的全局变量后访问本地属性?

Ruby和python在语言开始时提出了一些想法,因此可以避免这些问题。 PHP最初是一种快速破解某些c代码来处理表单和输出HTML的方法。因为PHP做出了合理的努力来向后兼容,所以你最终会像$ this这样古怪的工作。

来自Ruby的形式似乎有点冗长,但它是PHP的基本部分。

答案 1 :(得分:2)

PHP实例属性在内部通过$this->variable运算符访问,公共属性通过$object->property访问。

您可以通过self::$variable在内部访问类变量,类似于Ruby的类变量。 Discussion of self:: vs. $this-> in PHP

一般来说,你会发现PHP比Ruby更冗长,尤其是在引用变量所需的字符方面。

答案 2 :(得分:1)

如果您有实例变量(例如$foo),则只能通过$this->foo访问它。

如果绝望,你可以写一些类似$foo =& $this->foo;的内容,这样你就可以对同一个变量进行本地引用,但唯一的好处就是节省了一些字符,但却增加了混淆。