2

我想知道是否有更短、更好或更简洁的方法来分配和使用 PHP 中的类变量,然后通过$this->instance_variable

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

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

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

4

3 回答 3

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 的基本部分。

于 2010-10-11T16:29:57.500 回答
2

PHP 实例属性通过$this->variable内部操作符访问,公共属性为$object->property.

您可以通过 内部访问类变量self::$variable,这类似于 Ruby 的类变量。PHP 中 self:: 与 $this-> 的讨论

通常,您会发现 PHP 比 Ruby 更冗长,尤其是在引用变量所需的字符方面。

于 2010-10-11T16:29:44.830 回答
1

如果您有一个实例变量(例如您的$foo),则访问它的唯一方法是通过$this->foo.

如果不顾一切,您可以编写类似这样的东西,$foo =& $this->foo;这样您就可以对同一个变量进行本地引用,但唯一的好处是以增加混乱为代价来节省一些字符。

于 2010-10-11T16:15:11.923 回答