2012-01-03 2 views
0

Возможно ли отменить встроенные функции PHP? В моем случае вы ищете способ отменить функцию empty() только в моей (собственной) структуре. Это происходит из-за автоматически генерируемых данных, которые, как представляется, игнорируют мой метод __get() и __isset(), не всегда приводят к действительному результату.Отменить встроенную функцию PHP только в рамках

Можно ли это сделать, как мы также можем зарегистрировать несколько автозагрузчиков и создать структуры с унаследованными методами из принципов ООП? Мне нужно только это, чтобы работать в рамках.

+2

'empty()' не является функцией. Вы не можете переопределить его. – mario

ответ

2

Вы должны написать функцию самостоятельно, которая либо называет empty, либо магия в отношении этих проблемных классов.

Или иначе исправьте классы, чтобы они работали с empty, но я бы выбрал первый. Многие функции PHP не делают именно то, что вы хотите, поэтому, если у вас есть структура в любом случае, я бы обернул большинство из них, чтобы у вас всегда была возможность добавить свои собственные функции.

+0

Ну, это не моя вина, что 'empty ($ foo-> bar)' не получает triggerd '__get ($ p)', не так ли? «Эти проблемные классы работают нормально, но это ожидаемое поведение (http://php.net/manual/en/function.empty.php). См. Второе примечание. – Ben

+1

Я не говорю, что это твоя вина. Просто пытаюсь предложить альтернативы. Второе замечание, которое вы упомянули, похоже, реализует магический метод '__isset'. Поэтому вместо того, чтобы переопределять основную функцию (и, возможно, взломать любую библиотеку, которую вы собираетесь использовать в сочетании с вашей инфраструктурой), вы также можете попробовать это. – GolezTrol

4

Единственный способ, которым я отдаю себе отчет в переопределять функции в PHP (помимо изменения исходного кода) является с runkit - хотя есть довольно много никогда время, когда это правильный ответ на вопрос. Однако даже это, вероятно, не будет работать с empty(), потому что это языковая конструкция, а не функция.

+0

Это также кажется тяжелым? – Ben

+0

@BenFransen Извините, как вы относитесь к «тяжелым»? Я не могу его поднять, но это больше связано с моими руками и тем фактом, что они просто отказываются подбирать этот досадный код, а не вес ... ;-) – DaveRandom

0

Если я правильно понимаю вашу проблему, empty($foo->bar) не запускает Foo::__get(), верно? Это технически правильное поведение, так как $foo->barне существует, поэтому, конечно, он пуст. У вас есть несколько вариантов для получения поведения, которое вы ищете, но большинство из них связано с определением вашей собственной функции или метода класса, который делаетFoo::__get(). Например:

public function isEmpty($prop) { 
    $foo = $this->__get($prop); 
    return empty($foo); 
} 

Надеюсь, что это поможет.

Смежные вопросы