2013-11-02 2 views
1

Я создаю глобальные сеттеры и получатели для моего родительского класса, так как я не хочу создавать их для каждой переменной дочернего класса (но иногда я буду перезаписывать родительский глобальный сеттер/getter).Проверка наличия переменной для дочернего класса

Я использую __call с ним, и я разбором имя метода, как это:

if (strtolower(substr($method, 0, 3)) == "set") { 
    $variable = strtolower(substr($method, 3)); 
} 

Вопрос заключается в том, как я могу проверить, если переменные $ устанавливаются для дочернего класса (тот, который расширяет основной);

Если я:

if ($this->$variable) 

Я полагаю, что в первую очередь проверьте, если он существует в дочернем классе, а затем проверяет, если он существует в основном классе. Я хочу, чтобы это только для проверки дочернего класса, возможно ли это сделать?

Я знаю, что есть родитель :: но есть ли у ребенка эквивалент?

EDIT: Люди не понимают, о чем я прошу. Я знаю, как проверить, существует ли свойство. Я хочу знать, как проверить, существует ли свойство для класса CHILD, а не для класса MAIN. (класс РЕБЕНОК распространяется MAIN)

+0

Может быть, я «Я пропустил что-то, но я не понимаю, почему вы используете подход« __call ». Если ваш код правильно ориентирован на объект, вам не нужно прибегать к такому экзотическому решению. – Bart

+0

У меня есть сотни свойств, и я не хочу заполнять свои классы: setThis, setThat, setThose, setThem (и то же самое для get). Я только хочу создать эти функции, когда они делают что-то еще, чем задают или получают данные (например, дезинфекция). – unska

+0

Эта проблема может быть решена с помощью одного абстрактного класса, от которого наследуются другие классы. Другое преимущество заключается в том, что контракт становится ясным. С '__call' все становится волшебством. – Bart

ответ

0

Почему бы вам не использовать isset ??

if (isset($this->$variable)) 
+0

Как я сказал ранее, это будет проверять, существует ли он на дочернем или основном классе, и я хочу, чтобы он проверял только ребенка. – unska

2

В общем случае есть isset() функции, но не будет соответствовать этому делу. Используйте property_exists() вместо:

class Foo 
{ 
    public $pub = null; 
} 

$obj = new Foo(); 

var_dump(isset($obj->pub), property_exists('Foo', 'pub')); //false, true 

-Вот, потому что если proprty существует, но имеет нулевое значение, isset() вернет ложь - и вы не будете в состоянии отличаться случай, когда он не существует.

Если речь идет о динамических свойствах - тогда вы должны передать объект, а не имя класса, в property_exists(), поскольку свойство может отсутствовать в классе и затем динамически добавляться к объекту.

Теперь, если мы говорим о том, какой класс декларирует свойство, вы можете использовать Reflection в PHP, как это:

class Foo 
{ 
    public $pub = null; 
} 

class Bar extends Foo 
{ 
} 

$obj = new Bar(); 

$ref = new ReflectionObject($obj); 

var_dump($ref->getProperty('pub')->getDeclaringClass()->getName() == 'Bar');//false 
var_dump($ref->getProperty('pub')->getDeclaringClass()->getName() == 'Foo');//true 
+0

Тот же ответ вам, что касается Шанкара, проблема не в том, что я не знаю, как это проверить. Я хочу проверить, имеет ли класс CHILD это свойство. Я не хочу, чтобы он возвращал true, если класс MAIN имеет его. – unska

+0

@unska Я был на обновлении, да. См. Редактирование. –

+0

Кажется, это ужасный трудный способ сделать что-то настолько простое. :( – unska

0

Это работает для меня:

if(property_exists($get_class($this),$variable)){} 
Смежные вопросы