PHP 定義済みインターフェイスの分析

不言
リリース: 2023-04-01 09:28:01
オリジナル
1539 人が閲覧しました

この記事では、主に PHP の定義済みインターフェイスを整理します。IteratorAggregate (集約反復子 Iterator)、Countable、ArrayAccess、および Iterator の 4 つのインターフェイスが日常のプロジェクト プロセスでよく使用されます。必要な方は参照してください。

PHP には事前定義されたインターフェイスがいくつかあり、最も一般的に使用される 4 つのインターフェイス (

IteratorAggregate (集約集合反復子 Iterator)Countable ArrayAccessIterator) についてはそれぞれ詳しく紹介します。

IteratorAggregate (集約集合イテレーター) インターフェース

IteratorAggregate extends Traversable {
 abstract public Traversable getIterator(void)
}
ログイン後にコピー

このインターフェースは関数を実装します - 外部イテレーターの作成

foreach を使用する場合、それを具体的にどのように理解すればよいでしょうか。 オブジェクトを走査するときに、IteratorAggregate インターフェイスが継承されていない場合、オブジェクト内のすべてのパブリック プロパティが (public $var の形式でのみ) 走査されます。 IteratorAggregate を継承する場合、クラスに実装された getIterator メソッドによって返されるオブジェクトが使用されます。ここで、返されるオブジェクトは Traversable オブジェクトである必要があることに注意してください。 Traversable オブジェクトから拡張します。そうでない場合は、例外がスローされます。

//看个例子
class My{
 private $_data = [
 'a' => '燕睿涛',
 'b' => 'yanruitao',
 'c' => 'LULU',
 ];
 
 public function getIterator()
 {
 return new ArrayIterator($this->_data);
 }
}
$obj = new My;
foreach ($obj as $key => $value) {
 echo "$key => $value\n";
}
//输出结果为空 

class My implements IteratorAggregate {
 private $_data = [
 'a' => '燕睿涛',
 'b' => 'yanruitao',
 'c' => 'LULU',
 ];

 public function getIterator()
 {
 return new ArrayIterator($this->_data);
 }
}
$obj = new My;
foreach ($obj as $key => $value) {
 echo "$key => $value\n";
}
//结果:
a => 燕睿涛
b => yanruitao
c => LULU
ログイン後にコピー

Countable インターフェイス

Countable {
 abstract public int count(void)
}
ログイン後にコピー

このインターフェイスは、オブジェクトの数をカウントするために使用されます。具体的にどのように理解すればよいでしょうか? オブジェクトに対して

count を呼び出すと、関数が Countable を継承していない場合は、常に 1 が返されます。Countable## を継承している場合は、常に 1 が返されます。 # 実装された count を返します。次の例を見てください:

class CountMe
{ 
 protected $_myCount = 3; 

 public function count() 
 { 
 return $this->_myCount; 
 } 
} 

$countable = new CountMe(); 
echo count($countable);
//返回1

class CountMe implements Countable
{ 
 protected $_myCount = 3; 

 public function count() 
 { 
 return $this->_myCount; 
 } 
} 

$countable = new CountMe(); 
echo count($countable); 
//返回3


ArrayAccess接口
ArrayAccess {
 abstract public boolean offsetExists(mixed $offset)
 abstract public mixed offsetGet(mixed $offset)
 public void offsetSet(mixed $offset, mixed $value)
 public void offsetUnset(mixed $offset)
}


class CountMe
{ 
 protected $_myCount = 3; 

 public function count() 
 { 
  return $this->_myCount; 
 } 
} 

$countable = new CountMe(); 
echo count($countable);
//返回1

class CountMe implements Countable
{ 
 protected $_myCount = 3; 

 public function count() 
 { 
  return $this->_myCount; 
 } 
} 

$countable = new CountMe(); 
echo count($countable); 
//返回3
ログイン後にコピー
ArrayAccess インターフェイス

ArrayAccess {
 abstract public boolean offsetExists(mixed $offset)
    abstract public mixed offsetGet(mixed $offset)
    public void offsetSet(mixed $offset, mixed $value)
    public void offsetUnset(mixed $offset)
}
ログイン後にコピー
このインターフェースの機能は、配列オブジェクトのようにアクセスできるようにすることです。実際には、字句解析中にオブジェクトを使用するときに PHP が配列に遭遇すると、オブジェクトに戻ります。 ArrayAccess が実装されているかどうかを調べます。実装されている場合は、対応する操作 (set、unset、isset、get) を実行して、クラスに配列を配置し、クラスに配列の基本操作を実装させます。
class myObj
{
 
}
$obj = new myObj;
$obj['name'];
//Fatal error: Cannot use object of type myObj as array in 

class myObj implements ArrayAccess 
{
 public function offsetSet($offset, $value)
 {
  echo "offsetSet : {$offset} => {$value}\n";
 }

 public function offsetExists($offset)
 {
  echo "offsetExists : {$offset}\n";
 }

 public function offsetUnset($offset)
 {
  echo "offsetUnset : {$offset}\n";
 }

 public function offsetGet($offset)
 {
  echo "offsetGet : {$offset}\n";
 }
}
$obj = new myObj;
$obj[1] = '燕睿涛';
isset($obj['name']);
unset($obj['name']);
$obj['yrt'];

//输出结果:
offsetSet : 1 => 燕睿涛
offsetExists : name
offsetUnset : name
offsetGet : yrt

class myObj implements ArrayAccess 
{
 private $_data = [];
 public function offsetSet($offset, $value)
 {
  $this->_data[$offset] = $value;
 }

 public function offsetExists($offset)
 {
  return isset($this->_data[$offset]);
 }

 public function offsetUnset($offset)
 {
  unset($this->_data[$offset]);
 }

 public function offsetGet($offset)
 {
  return $this->_data[$offset];
 }
}

$obj = new myObj;
$obj['yrt'] = '燕睿涛';
var_dump($obj['yrt']);
var_dump(isset($obj['yrt']));
unset($obj['yrt']);
var_dump(isset($obj['yrt']));
var_dump($obj['yrt']);

//输出:
string(9) "燕睿涛"
bool(true)
bool(false)
Notice: Undefined index: yrt //最后一个会报出Notice
ログイン後にコピー

上記のオブジェクトは、基本的な配列操作、さらにはトラバーサルにのみ使用できます。前の

IteratorAggregate

foreach:

class myObj implements ArrayAccess, IteratorAggregate
{
private $_data = [];

 public function getIterator()
 {
  return new ArrayIterator($this->_data);
 }

 ......
}
$obj = new myObj;
$obj['yrt'] = '燕睿涛';
$obj[1] = '燕睿涛';
$obj['name'] = '燕睿涛';
$obj['age'] = 23;

foreach ($obj as $key => $value) {
 echo "{$key} => {$value}\n";
}
//输出:
yrt => 燕睿涛
1 => 燕睿涛
name => 燕睿涛
age => 23
ログイン後にコピー
と組み合わせることはできません。 Iterator インターフェース:

Iterator extends Traversable {
    abstract public mixed current(void)
    abstract public scalar key(void)
    abstract public void next(void)
    abstract public void rewind(void)
    abstract public boolean valid(void)
}
ログイン後にコピー
内部的に反復可能 独自の外部イテレーターまたはクラスのインターフェース これは公式ドキュメントによる説明ですが、まだわかりにくいです。実際、このインターフェースで実装される関数は trratorAggregate

(ドキュメント: 外部イテレータインターフェースを作成する、インターフェースは直接イテレータを返す) と同じような気がしますが、これはクラス定義で実装されています例を見てみましょう:

class myObj implements Iterator{

 private $_data = [];

 public function __construct(Array $arr)
 {
 $this->_data = $arr;
 }

 public function current()
 {
 return current($this->_data);
 }

 public function key()
 {
 return key($this->_data);
 }

 public function next()
 {
 next($this->_data);
 }

 public function rewind()
 {
 reset($this->_data);
 }

 public function valid()
 {
 return $this->key() !== NULL;
 }
}

$t = [
 'yrt' => '燕睿涛',
 'name' => '燕睿涛',
 false,
 '燕睿涛'
];
$obj = new myObj($t);

foreach ($obj as $key => $value) {
 echo "{$key} => ".var_export($value, true)."\n";
}
//输出:
yrt => '燕睿涛'
name => '燕睿涛'
0 => false
1 => '燕睿涛'
ログイン後にコピー
上記は、テスト問題 (イテレータ モード) に関する Niao 兄弟の記事を参照していますが、値が見つかった場合の Bird 兄弟の有効な判断には少し欠陥があります。 false の場合は切り詰められます。

まとめ

これだけ話したのに、まだその有用性を理解していないようです。Yii2 のソースコードにはこれらがたくさん使われているので、見てみることをお勧めします。読んでみると「おお~便利そう…」と徐々に感じてきます。

以上がこの記事の全内容です。皆様のお役に立てれば幸いです。関連コンテンツについては、PHP 中国語 Web サイトに注目してください。

関連する推奨事項:

PHP を介して現在のページ URL 関数を取得する方法


ユーザーが URL にアクセスできないようにする方法PHP バックグラウンドで直接コードを分析する

以上がPHP 定義済みインターフェイスの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート