Как запросить несуществующий элемент массива через магический метод __get?

Чувствую, что это нельзя сделать) Но все же, вдруг можно, а я не нашел как.
class foo{
	private $arr = array('1'=>'one', '2'=>'two');
	
	public function __get($property){
		if(empty($this->$property)){
			return -1;
		} else {
			return $this->$property;
		}
	}
}

$a = new foo();
print_r($a->arrzzzz); // Работает, выводит -1
print_r($a->arr); // Работает, выводит весь массив
print_r($a->arr[2]); // Работает, выводит элемент массива
print_r($a->arr[3]); // Ошибка:  Undefined offset


Что делать, как быть? Как узнать в __get индекс запрашиваемого массива? Его нигде не видно...
  • Вопрос задан
  • 272 просмотра
Пригласить эксперта
Ответы на вопрос 2
He11ion
@He11ion
PHP-monkey
Так можно, но без __get
<?php 

class foo{
  private $arr;
  
  public function __construct()
  {
	  $this->arr = new MyArray();
  }
  
  public function __get($property){
	  
    if(empty($this->$property)){
      return -1;
    } else {
      return $this->$property;
    }
  }
}


class MyArray implements ArrayAccess {
    private $container = array();

    public function __construct() {
        $this->container = array(
             1 => "one" ,
             2  => "two",
        );
    }
	
	  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] : -666;
    }
}


$a = new foo();
var_dump($a->arrzzzz);
var_dump($a->arr[2]);
var_dump($a->arr[3]);
Ответ написан
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
Нет, magic methods про классы. Вам нужно вот: php.net/manual/en/class.arrayaccess.php
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы