2013-09-29 3 views
3

Чтобы сделать это простым, я заметил, что PHP, похоже, не предлагает какой-либо магической константы для определения того, какое имя изменило черту в классе. Поскольку это звучит смутно для меня словами, я приведу пример, поскольку это довольно легко и ожидало, что он будет где-то в новом PHP 5.5, я не вижу способа его выполнения. Так вот:Кто-нибудь знает PHP Magic Constant для переопределенного имени Trait в классе?

Скажет, у нас есть класс, который использует некоторые черты, которые конфликтуют с некоторой функцией внутри класса, например:

class SomeClass { 
    use \Name\Space\SomeTrait { SomeFunction as private NewFunctionName; } 

    function SomeFunction() { 
     $this->NewFunctionName(); 
    } 
} 

Поскольку, очевидно, этот класс имеет функцию «SomeFunction», и мы знаем, что внутри SomeTrait, который мы включили, является функцией, которая сопоставляет по имени функции, которую мы имеем внутри этого класса. Теперь, поскольку «SomeFunction» вошел в этот класс через черту внутри \ Name \ Space, эти 2 функции выполняют две разные вещи, но, случается, используют одно и то же имя и внутри любой другой функции или буквально нашу функцию «SomeFunction», , мы затем используем «SomeFunction» из нашей черты, называя ее «NewFunctionName».

Так что, надеюсь, я никого здесь не потерял, так как в этом заключается мой вопрос в приведенном выше сценарии. Внутри \ Name \ Space \ SomeTrait \ SomeFunction(), как можно получить "NewFunctionName", что эта функция признака была назначена тоже? Можно было бы подумать, чтобы использовать магический метод, такие как __ FUNCTION __ или __ МЕТОД __ или даже __ Черту __, за исключением того, ни один из них дают ожидаемый результат, так что делает кто-нибудь знаете способ получить эту информацию, не передавая ее функции как параметр и приводящую к взлому кода? Может быть, PHP 5.6 необходимо добавить новый магическая константа __ AS __ или скорректировать результат __ TRAIT __, я не понимаю, почему __ TRAIT __ и __ FUNCTION _ необходимо вернуть ту же информацию (или почти такую ​​же информацию). Любая помощь была бы удивительной, если бы это был нетрадиционный хакерский метод, мне хотелось увидеть мои варианты, пока я не смогу открыть отчет об ошибке с php об этом. (Если это действительно ошибка)

редактировать:

Мой текущий, наименее Hacky, метод представляется,

debug_backtrace()[0]['function'] 

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

+0

Вы когда-нибудь находили ответ на этот вопрос? У меня такой же вопрос. – diolemo

ответ

1

Это решение, в котором я закончил использование. Это не очень хорошо, но, вероятно, лучше, чем использование функции debug_backtrace.

Пример Проблема: Пример

Trait ExampleTrait { 
    protected function doSomethingRecursive() { 
     // this is a problem because it could be renamed 
     $this->doSomethingRecursive(); 
    } 
} 

Решение:

Trait ExampleTrait { 

    protected function doSomethingRecursive() { 
     // this is a problem because it could be renamed 
     $this->__internal_doSomethingRecursive(); 
    } 

    private function __internal_doSomethingRecursive() { 
     // this works because the class would have 
     // used and renamed the above function 
     // but this "internal" function *should* 
     // remain available under it's original name 
     $this->__internal_doSomethingRecursive(); 
    } 

} 

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

1

Ваше текущее решение будет лучшим, с парой твиков:

debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS,1)[0]['function'] 

DEBUG_BACKTRACE_IGNORE_ARGS и предел рамки 1 будет сделать трассировку неглубоко, быстрее и использовать меньше памяти.