2010-10-11 105 views
2

我想知道是否有一個更短,更好或更乾淨的方式來分配和使用PHP中的類變量,然後通過$this->instance_variablePHP相當於Ruby的@instance_variable?

​​

我不是很熟悉所有PHP的變量範圍,但是從我在官方文檔的理解,你可以將它們定義全局,或訪問低谷$this->? 是否有關鍵字將它們定義爲實例變量,因此它們可以像Rubys @variable那樣訪問?

回答

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的面向對象的語法是基於世界的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?如果你說它應該是全局變量,那麼聲明一個具有相同名稱global的變量後,你如何訪問本地屬性?

Ruby和python在語言開始時給了一些想法,所以可以避免這些問題。 PHP開始作爲一種快速方法來破解一些c代碼來處理表單和輸出HTML。因爲PHP做出合理的努力是向後兼容的,所以你最終會得到像$這樣的奇特工作。

即將到來的形式Ruby似乎有點冗長,但它是PHP的基礎部分。

1

如果你有一個實例變量(如你的$foo),訪問它的唯一方法是通過$this->foo

如果不顧一切,你可以寫一些類似於$foo =& $this->foo;的東西,這樣你就可以對同一個變量進行本地引用,但唯一的好處是以增加混淆的代價來節省幾個字符。

2

PHP實例屬性可通過$this->variable運營商在內部訪問,公共屬性爲$object->property

您可以通過self::$variable在內部訪問類變量,這與Ruby的類變量類似。 Discussion of self:: vs. $this-> in PHP

通常,您會發現PHP比Ruby更詳細,尤其是引用變量所需的字符。