程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 在PHP中把對象當數組使用

在PHP中把對象當數組使用

編輯:關於PHP編程

   我們了解,JAVASCRIPT中,對象的屬性、方法,是可以用數組的模式來訪問的。但通常情況下是不可能的。

        為什麼要這麼做?這是因為,通過這一方式,可以更加方便地操作對象,我們可以定義一個類。而不是定義一個Key Value數組。自然,如果我們還有其它的辦法,一種最簡單的,就是強制轉換成數組。但,這樣會失去對象中原有的方法。

        不過,SPL中的ArrayObject可以幫助我們用數組模式訪問屬性。但方法仍不能實現。

        ArrayObject類結構如下(部分方法是在php5,1或php5.2時才加上的):

Php代碼 
ArrayObject implements IteratorAggregate , Traversable , ArrayAccess , Serializable , Countable {  
/* 常量 */ 
const integer STD_PROP_LIST = 1 ;  
const integer ARRAY_AS_PROPS = 2 ;  
/* 方法 */ 
__construct ([ mixed $input [, int $flags [, string $iterator_class ]]] )  
void append ( mixed $value )  
void asort ( void )  
int count ( void )  
array exchangeArray ( mixed $input )  
array getArrayCopy ( void )  
int getFlags ( void )  
ArrayIterator getIterator ( void )  
int getIteratorClass ( void )  
void ksort ( void )  
void natcasesort ( void )  
void natsort ( void )  
bool offsetExists ( mixed $index )  
mixed offsetGet ( mixed $index )  
void offsetSet ( mixed $index , mixed $newval )  
void offsetUnset ( mixed $index )  
public void serialize ( void )  
void setFlags ( int $flags )  
void setIteratorClass ( string $iterator_class )  
void uasort ( callback $cmp_function )  
void uksort ( callback $cmp_function )  
public void unserialize ( string $serialized )  

ArrayObject implements IteratorAggregate , Traversable , ArrayAccess , Serializable , Countable {
/* 常量 */
const integer STD_PROP_LIST = 1 ;
const integer ARRAY_AS_PROPS = 2 ;
/* 方法 */
__construct ([ mixed $input [, int $flags [, string $iterator_class ]]] )
void append ( mixed $value )
void asort ( void )
int count ( void )
array exchangeArray ( mixed $input )
array getArrayCopy ( void )
int getFlags ( void )
ArrayIterator getIterator ( void )
int getIteratorClass ( void )
void ksort ( void )
void natcasesort ( void )
void natsort ( void )
bool offsetExists ( mixed $index )
mixed offsetGet ( mixed $index )
void offsetSet ( mixed $index , mixed $newval )
void offsetUnset ( mixed $index )
public void serialize ( void )
void setFlags ( int $flags )
void setIteratorClass ( string $iterator_class )
void uasort ( callback $cmp_function )
void uksort ( callback $cmp_function )
public void unserialize ( string $serialized )
}

        其中:我們為什麼可以用 $obj[name] 直接訪問到 $obj->name呢? 主要是上面的方法中的三個方法:

        offsetGet 支持$obj[name] 讀的方式

        offsetSet 支持$obj[name] 寫的方式

        但foreach則是該類對ArrayAccess的函數Current等的默認實現。

        看一個例子代碼:

Php代碼 
class test extends ArrayObject{  
    public $name;  
    private $age = 21;  
    public function show(){  
        print_r(get_object_vars($this));  
    }  
}  
class test1{  
    public $name;  
    private $age = 21;  
    public function show(){  
        print_r(get_object_vars($this));  
    }  
}  
$obj=new test();  
//使用數組方式讀寫屬性  
$obj[name]=hello;  
$obj[nick]=mockArray;  
echo $obj[nick], </br>;     
var_dump($obj[show]);//檢測是否可以訪問方法:      
print_r($obj);//輸出對象      
$obj->show();//調用方法  
$arr=(array)$obj; //強制轉換成數組。      
print_r($arr);  
//$arr->show(); 此行將出錯,因為,原有方法全部丟失。  
$obj1=new test1(); //創建普通對象  
$arr1=(array)$obj1; //強制轉換成數組。  
print_r($arr1); //隱私完全暴光 

 class test extends ArrayObject{
  public $name;
  private $age = 21;
  public function show(){
   print_r(get_object_vars($this));
  }
 }
 class test1{
  public $name;
  private $age = 21;
  public function show(){
   print_r(get_object_vars($this));
  }
 }
 $obj=new test();
 //使用數組方式讀寫屬性
 $obj[name]=hello;
 $obj[nick]=mockArray;
 echo $obj[nick], </br>; 
 var_dump($obj[show]);//檢測是否可以訪問方法: 
 print_r($obj);//輸出對象 
 $obj->show();//調用方法
 $arr=(array)$obj; //強制轉換成數組。 
 print_r($arr);
 //$arr->show(); 此行將出錯,因為,原有方法全部丟失。
 $obj1=new test1(); //創建普通對象
 $arr1=(array)$obj1; //強制轉換成數組。
 print_r($arr1); //隱私完全暴光

         這段代碼會輸出:

mockArray</br>NULL
test Object
(
    [name] => hello
    [nick] => mockArray
)
Array
(
    [name] => hello
    [nick] => mockArray
)
Array
(
    [name] => hello
    [nick] => mockArray
)
Array
(
    [name] =>
    [ test1 age] => 21
)

         可以看出,完全可以使用數組模式訪問屬性,但不能訪問到方法(成員函數)。

         強制轉換後,即是數組對象,再無成員函數了。

         當然 offsetGet  offsetSet 這兩個方法,也可以根據我們的需要進一步改寫。為什麼?因為,如果有一些十分變態的需求之時,肯定有用。比如,我們要將三個數組用引用的方式包裝到一個對象中,當成一個數組來訪問。這時,就要重寫這兩個函數。當然,同時也要重寫ArrayAccess接口中對應的函數。

         再有,能夠訪問到的均是公有屬性。如果是私有的,則訪問不到的。即便是強制轉換成數組,也是一樣。但如果沒有繼承ArrayObject,則就不同了。這樣的類,一旦強制轉換成數組,其隱私(私有的屬性)也就被暴光了。

         不過我們可以看出,私有屬性轉換成數組以後,未保留原有屬性名。而是使用了:某個不可打印字符+類名+不可打印字符+屬性名的形式。這個不可打印字符ASCII是多少沒有查,你要有興趣可以查一下!

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved