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

PHP でオブジェクトを配列として使用する

巴扎黑
巴扎黑オリジナル
2016-12-01 09:57:162276ブラウズ

JAVASCRIPT では、オブジェクトのプロパティとメソッドに配列モードを使用してアクセスできることを理解しています。しかし通常、これは不可能です。

なぜこんなことをするのですか?このようにすることで、オブジェクトをより便利に操作できるようになり、クラスを定義できるようになるからです。 Key Value 配列を定義する代わりに。もちろん、他の方法がある場合、最も簡単な方法は強制的に配列に変換することです。ただし、これにより、オブジェクト内の元のメソッドが失われます。

ただし、SPL の ArrayObject は、配列モードを使用してプロパティにアクセスするのに役立ちます。しかし、この方法はまだ実装できません。

ArrayObject クラスの構造は次のとおりです (一部のメソッドは php5,1 または php5.2 で追加されました):

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 に直接アクセスできるのか毛織物? 上記のメソッドのうち主に 3 つ: offsetGet は $obj['name'] 読み取りメソッドをサポートします

offsetSet は $obj['name'] 書き込みメソッドをサポートします

ただし、foreach はこのクラスが使用する ArrayAccess のタイプです 関数のデフォルト実装電流などコード例を見てください:

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[&#39;nick&#39;], &#39;</br>&#39;;
var_dump($obj[&#39;show&#39;]);//检测是否可以访问方法:
print_r($obj);//输出对象
$obj->show();//调用方法
$arr=(array)$obj; //强制转换成数组。
print_r($arr);
//$arr->show(); 此行将出错,因为,原有方法全部丢失。
$obj1=new test1(); //创建普通对象
$arr1=(array)$obj1; //强制转换成数组。
print_r($arr1); //隐私完全暴光

このコードは次のように出力します:

mockarray & lt;/br & gt; null

test object

(

[name] = & gt; hello

[nick] = & gt;のように
)
(
[名前] => hello
[ニック] => モック配列
)
配列
(
[名前] => こんにちは
[ニック] => モック配列
)
配列
(
[ name] = >
[ test1 age] => 21
)

配列モードを使用してプロパティにアクセスできることがわかりますが、メソッド (メンバー関数) にはアクセスできません。即、強制変換後は配列オブジェクトとなり、メンバ関数は存在しません。

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

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。