php 대상을 훑어보는 방법

php에 대해 말하자면foreach는 매우 편리하고 사용하기 좋은 문법으로 거의 모든 phPer에 대해 일상적인 접촉이 가장 많은 요청 중의 하나이다.그렇다면 대상은foreach를 통해 두루 훑어볼 수 있을까?
답은 긍정적이지만, 대상의 반복은 공공적 속성만 얻을 수 있다는 조건이 있다.

//  
class A
{
    public $a1 = '1';
    public $a2 = '2';
    public $a3 = '3';

    private $a4 = '4';
    protected $a5 = '5';

    public $a6 = '6';

    public function test()
    {
        echo 'test';
    }
}
$a = new A();
foreach ($a as $k => $v) {
    echo $k, '===', $v, PHP_EOL;
}

// a1===1
// a2===2
// a3===3
// a6===6
방법이든 보호받거나 개인적인 변수든 두루 훑어볼 수 없다.공공의 속성만이 두루 퍼질 수 있다.사실 우리가 이전에 디자인 모델을 이야기할 때 말했던 교체기 모델은 대상을 훑어보는 데 사용된 것이고 PHP는 이미 우리를 위해 관련 인터페이스를 준비했기 때문에 우리는 이 인터페이스를 실현하기만 하면 교체기 모델의 창설을 완성할 수 있다.구체적인 내용은 이전의 디자인 모델 시리즈를 참고할 수 있다PHP 디자인 모드의 교체기 모드

//  
class B implements Iterator
{
    private $var = [];

    public function __construct($array)
    {
        if (is_array($array)) {
            $this->var = $array;
        }
    }

    public function rewind()
    {
        echo "rewinding
"; reset($this->var); } public function current() { $var = current($this->var); echo "current: $var
"; return $var; } public function key() { $var = key($this->var); echo "key: $var
"; return $var; } public function next() { $var = next($this->var); echo "next: $var
"; return $var; } public function valid() { $var = $this->current() !== false; echo "valid: {$var}
"; return $var; } } $b = new B([1, 2, 3, 4]); foreach ($b as $k => $v) { echo $k, '===', $v, PHP_EOL; } // rewinding // current: 1 // valid: 1 // current: 1 // key: 0 // 0===1 // next: 2 // current: 2 // valid: 1 // current: 2 // key: 1 // 1===2 // next: 3 // current: 3 // valid: 1 // current: 3 // key: 2 // 2===3 // next: 4 // current: 4 // valid: 1 // current: 4 // key: 3 // 3===4 // next: // current: // valid:
만약 오늘의 문장이 이전에 말한 교체기 모델만 말한다면 너무 재미없기 때문에 우리는 더욱 재미있는 응용을 배워야 한다.그것은 대상이 수조처럼 조작할 수 있도록 하는 것이다.이것도 사실 PHP를 사용하여 이미 우리를 위해 준비한 인터페이스이다. Array Access.

//  
class C implements ArrayAccess, IteratorAggregate
{
    private $container = [];
    public function __construct()
    {
        $this->container = [
            "one" => 1,
            "two" => 2,
            "three" => 3,
        ];
    }
    public function offsetSet($offset, $value)
    {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }
    public function offsetExists($offset)
    {
        return isset($this->container[$offset]);
    }
    public function offsetUnset($offset)
    {
        unset($this->container[$offset]);
    }
    public function offsetGet($offset)
    {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }

    public function getIterator() {
        return new B($this->container);
    }
}

$c = new C();
var_dump($c);

$c['four'] = 4;
var_dump($c);

$c[] = 5;
$c[] = 6;
var_dump($c);

foreach($c as $k=>$v){
    echo $k, '===', $v, PHP_EOL;
}

// rewinding
// current: 1
// valid: 1
// current: 1
// key: one
// one===1
// next: 2
// current: 2
// valid: 1
// current: 2
// key: two
// two===2
// next: 3
// current: 3
// valid: 1
// current: 3
// key: three
// three===3
// next: 4
// current: 4
// valid: 1
// current: 4
// key: four
// four===4
// next: 5
// current: 5
// valid: 1
// current: 5
// key: 0
// 0===5
// next: 6
// current: 6
// valid: 1
// current: 6
// key: 1
// 1===6
// next: 
// current: 
// valid: 
이 인터페이스는 우리가 네 가지 방법을 실현해야 한다.
  • offsetSet($offset, $value), 오프셋에 따라 값을 설정합니다
  • offsetExists($offset), 오프셋에 따라 컨텐트 존재 여부를 결정합니다
  • offsetUnset($offset), 오프셋에 따라 내용을 삭제합니다
  • offsetGet($offset), 어렴풋이 콘텐츠 가져오기
  • 이곳의 편이량은 바로 우리가 흔히 말하는 하표이다.이 네 가지 방법을 실현함으로써 우리는 조작 수조와 같은 조작 대상을 실현할 수 있다.물론 일상적인 개발에서 우리는 교체기를 포함한 이 대상들을 두루 돌아다니는 능력을 자주 사용하지 않을 수도 있다.보통 우리는 대상을 수조 (array) obj로 바꾸어 다음 동작을 진행합니다.그러나 자바에서, 특히 자바빈에서는 클래스 내부에 리스트가 자신의 대상을 위해 자신의 집합 상태를 표시하는 경우가 많다.비교를 통해 우리는 PHP도 이러한 능력을 충분히 실현할 수 있고 교체기와 Array Access 인터페이스를 사용하면 유사한 능력을 더욱 편리하게 실현할 수 있음을 발견했다.이것은 매우 유용한 지식 확장입니다. 아마도 다음 프로젝트에서 당신은 이런 능력을 운용할 수 있을 것입니다!
    테스트 코드:github.com/zhangyue050…
    이상은 php가 대상을 훑어보는 방법의 상세한 내용입니다. php가 대상을 훑어보는 것에 대한 더 많은 자료는 저희 다른 관련 문장에 주목하세요!

    좋은 웹페이지 즐겨찾기