Кто-нибудь знает магическую константу PHP для переопределенного имени черты в классе?

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

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

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 __, __ METHOD __ или даже __ TRAIT __, за исключением того, что ни один из них не дает ожидаемого результата, поэтому кто-нибудь знает способ получить эту информацию, не передавая ее функция в качестве параметра и в результате хакерский код? Возможно, PHP 5.6 должен добавить новую магическую константу __ AS __ или скорректировать результат __ TRAIT __, я не понимаю, почему __ TRAIT __ и __ FUNCTION _ должны возвращать одну и ту же информацию (или почти ту же информацию). Любая помощь будет отличной, если это нестандартный хакерский метод, я заинтересован в том, чтобы увидеть мои варианты, пока я не смогу открыть сообщение об ошибке с php по этому поводу. (если это действительно ошибка)

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

Мой текущий, наименее хакерский метод, кажется,

 debug_backtrace()[0]['function']

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

2 ответа

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

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

DEBUG_BACKTRACE_IGNORE_ARGS и предел кадра 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(); 
    }

}

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

Другие вопросы по тегам