Перегрузка PHP - избегайте Примечание: Попытка получить свойство не-объекта - PullRequest
0 голосов
/ 17 декабря 2011

Я использую методы __get и __set для перегрузки переменных.

В некоторых случаях я назначу другой объект переменной, например:

$object->name->another = $another_object;

$object, имеет методы __get и __set.Когда я пытаюсь получить доступ к $object->name->another до того, как он будет установлен, я получаю сообщение об ошибке

Примечание: при попытке получить свойство не-объекта

Есть ли что-нибудь вокругиспользуя перегрузку?без проверки isset по переменной.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 17 декабря 2011

Хотя это не отвечает на ваш вопрос, оно затрагивает важный аспект:

Стоит отметить, что вы не должны позволять своим магическим __get и __set методам поднять это уведомление. «Лучшей практикой» является использование одного из новых типов исключений SPL, специально разработанных для этой цели. Например:

public function __get($name)
{      
  if (isset($this->vals[$name])) {
    return $this->vals[$name];
  } else {
    $msg = "Invalid property: '$name' does not exist";
    throw new OutOfBoundsException($msg);
  }
}

А для __set ...

public function __set($name, $val)
{      
  if (isset($this->vals[$name])) {
    $this->vals[$name] = $val;
  } else {
    $msg = "Invalid property: '$name' does not exist";
    throw new OutOfBoundsException($msg);
  }
}

Вот ссылка на полезную статью на тему новых типов исключений SPL.

1 голос
/ 17 декабря 2011

Не $object, но $object->name должна иметь перегрузку с __get() / __set(), если вы хотите взаимодействовать, чтобы предотвратить данную ошибку:

$object->name->another = 'something';
^^^^^^^^^^^^^

Например, вы можете сделать$object::__get() возвращает пустой stdClass объект, в этом случае PHP автоматически назначит ему открытый член.

0 голосов
/ 17 декабря 2011

Просто убедитесь, что вы возвращаете перегруженный класс для «name».PHP извлечет свойство, затем попытается установить второе свойство для результирующего объекта.

<?php
class Bob {
    public function __get($name) {
        return new Jim();
    }
}
class Jim extends Bob {
    public function __get($name) {
        return 12;
    }
}

$b = new Bob();
echo $b->someJim->apples;
...