2011-11-26 87 views
1

我試過,但無法得到它的工作:如何從PHP中的同一類中的其他方法訪問變量?

class Profile extends CI_Controller { 

    public function index() { 
     $foo = 'bar'; 
    } 

    public function form_submit() { 
     echo $this->index()->foo; 
    } 

} 

我知道我可以通過外界宣佈其在類級別的所有方法,並聲明爲使變量訪問類中的所有方法上市。但是在這裏我需要在其中一個方法中聲明變量。

+1

你不能這樣做,因爲'$ foo'超出了範圍;您需要使用類屬性或會話變量,或者執行'echo $ this-> index();'並返回'$ foo'。當然,您可以將類屬性設置爲'private'範圍,因此只有類可以訪問它。 –

+0

添加了CI標記,因爲CodeIgniter中的控制器方法與常規PHP類方法的工作方式稍有不同,這可能會影響您的問題,也可能不會影響您的問題。但是@Jar Farrish說的也有效。 – BoltClock

回答

2

如果您在方法內聲明它,除非您返回值,否則您運氣不佳。

class Profile { 

    public function index() { 
     $foo = 'bar'; 
     return $foo; 
    } 

    public function form_submit() { 
     echo $this->index(); 
    } 
} 

一個也許更好的選擇是將它聲明爲一個對象變量(你描述爲「在類級別」),但聲明它是私人的。

class Profile { 

    private $foo; 

    public function index() { 
     $this->foo = 'bar'; 
    } 

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

} 
+0

如果在index()方法中有兩個變量,那麼你的第一個例子呢?! – Shafizadeh

+0

@Shafizadeh你只能返回一個變量,如果你必須返回多個變量,那麼你需要返回一個數組/對象 – rafi

0

不!在任何情況下,我們都可以想象在另一種方法中訪問變量是有用的或必要的。

類是對共享狀態進行操作的方法的集合。通過實例化類的對象來創建共享狀態。

由於index()form_submit()共享$foo狀態,你的代碼應該這樣寫:

class Profile extends CI_Controller { 

    private 
    $foo; 

    public function index() { 
     $this->foo = 'bar'; 
    } 

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

} 

在某些情況下,registry pattern可能會有所幫助。但不是在你的情況。

或者,您可以將$foo提升到全局範圍。但由於這是非常不好的風格,我不願意提供一個代碼示例。抱歉。

相關問題