ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルでオブジェクトを配列として使用する

PHP_PHP チュートリアルでオブジェクトを配列として使用する

WBOY
WBOYオリジナル
2016-07-13 17:44:06786ブラウズ

   我们了解,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;
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],
;// メソッドにアクセスできるかどうかを確認する:
print_r($ obj); //出力オブジェクト$ obj->
print_r($arr);
//$arr->show(); この行は元のメソッドがすべて失われるため、エラーが発生します。
$obj1=new test1(); //通常のオブジェクトを作成します
$arr1=(array)$obj1; //配列への強制変換。
print_r($arr1); //プライバシーは完全に公開されます

クラス 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],
;
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
NULL
テストオブジェクト
(
[name] =>hello
[nick] =>mockArray
)

Array

(

[name] =>hello

[nick] =>mockArray
)
配列
(
[名前] => こんにちは
[ニック] => モック配列
)
配列
(
[名前] =>
[test1 年齢] => 21
)

配列モードを使用してプロパティにアクセスできることがわかりますが、メソッド (メンバー関数) にはアクセスできません。

強制変換後は配列オブジェクトとなり、メンバー関数はありません。
E もちろん、Officetgets OFFSETSET の 2 つのメソッドは、必要に応じてさらに書き直すこともできます。なぜ?非常に異常なニーズがあれば、間違いなく役立つからです。たとえば、参照を使用して 3 つの配列をオブジェクトにラップし、配列としてアクセスしたいとします。このとき、この2つの関数を書き換える必要があります。もちろん、ArrayAccess インターフェイスの対応する関数も書き直す必要があります。
访 パブリック属性にどのようにアクセスできるかは関係ありません。プライベートの場合はアクセスできません。無理やり配列にしても同じです。ただし、ArrayObject を継承しない場合は異なります。このようなクラスを強制的に配列に変換すると、そのプライバシー (プライベート属性) が暴露されてしまいます。

ただし、プライベート属性が配列に変換された後は、元の属性名が保持されていないことがわかります。代わりに、特定の印刷不可能な文字 + クラス名 + 印刷不可能な文字 + 属性名という形式が使用されます。この印刷不可能な文字の ASCII 値はチェックされていません。興味がある場合は、チェックしてください。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478766.html技術記事 JAVASCRIPT では、配列モードを使用してオブジェクトのプロパティとメソッドにアクセスできることを理解しています。しかし通常、これは不可能です。 なぜこれを行うのでしょうか?なぜなら、それは...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。