2010-03-13 119 views
2

我想知道是否有人可以在這裏幫忙,我想了解如何跨多個非課程頁面使用對象屬性,但我似乎無法讓我的頭繞過我的一切迄今爲止已經嘗試過。php變量範圍在oop

例如一個叫做person的類;

class person { 
static $name;  
} 

,但我有一個數字,想利用全線$name不同常規的網頁。

我嘗試這樣的事情;

pageone.php

include "person.php"; 
$names = new Person(); 

echo person::$name; 
names::$name='bob'; 

pagetwo.php

include "person.php"; 
echo person::$name; 

我可以帶班工作,我沒事,只要我創建新實例的每個頁面的程度,卻怎麼也使一個對象的屬性可用於所有對象,如共享變量?

感謝

回答

3

PHP腳本的每一個新的實例「忘記」一切都在以前的腳本來完成。通過頁面加載爲數據建立「存儲空間」的常用方式是會話。會話本質上是用戶訪問頁面時獲得的特定ID。該ID存儲在cookie中,或存儲在每個URL後面的GET變量中。 PHP將文本文件保存在可包含會話特定數據的特殊目錄中。每個文件都使用會話ID命名。

PHP手冊在這裏有一個thorough introduction

pageone.php 

session_start(); 
$_SESSION["name"] = "Bob", 

pagetwo.php 

session_start(); 

echo $_SESSION["name"]; // Bob 

現在,如果你有一個實例化的對象,你可以serialize它,它存儲在一個會話變量,並反序列化回在第2頁。儘管如此,我不認爲這可以通過靜態類來完成。但這應該是一個好的開始。

+0

@Pekka:實例不需要被序列化。 PHP會話通常會自動序列化,按照ini設置:'session.serialize_handler = php' – 2010-03-13 20:09:46

+0

謝謝,我將使用會話變量 – 2010-03-13 20:45:44

0

需要初始化類聲明本身內部的靜態變量:

class Person { 
    public static $name = 'bob'; 
} 

或者,你需要一些引導機制,在那裏你inititalize靜態變量:

bootstrap.php中:

Person::$name = 'bob'; 

然後在頁面中:

// assuming, you preloaded the bootstrap somewhere first 
$person = new Person(); 

echo $ person :: $ name;

編輯
哎,我在想什麼......上面甚至不會工作。您不能像訪問實例那樣訪問靜態成員。只有通過一個方法,像這樣:

class Person 
{ 
    public static $name; 

    public function getName() 
    { 
     return self::$name; 
    } 

} 

// assuming, you preloaded the bootstrap somewhere first 
$person = new Person(); 
echo $person->getName(); 

/編輯完

或者作爲佩卡·指出,使用會話保持狀態。

但更重要的是:你試圖達到的目標是什麼?如果你想在不同的請求之間保持一個Person對象的狀態,那麼Pekka的路線是要走的路,或者使用另一個持久性存儲機制,比如DB,File等...

因爲我認爲你不要是不是有每個單個實例都叫做'bob'?我認爲你的意思是保持單個人員實例的狀態。

因此,總結一下,您可能不想使用靜態成員開始。

+0

感謝,它看起來像我需要使用會話。上面的代碼更多的是一個例子 - 我對oop有點困惑,我認爲一旦你創建了一個對象的實例 - 它坐在內存中,具有它的所有屬性。我試圖找出如何訪問不同的常規PHP頁面上的一個實例的屬性。 – 2010-03-13 20:43:40