Кто-нибудь знает о магической константе 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 функции делают 2 разные вещи, но используют одно и то же имя и внутри либо другой функции, либо буквально нашей «SomeFunction». , затем мы используем «SomeFunction» из нашего типажа, вызывая его по «NewFunctionName».

Так что, надеюсь, я никого здесь не потерял, так как вот к чему сводится мой вопрос в приведенном выше сценарии. Как в \Name\Space\SomeTrait\SomeFunction() можно получить "NewFunctionName", которому также была назначена эта функция типажа? Можно было бы подумать об использовании магического метода, такого как __ФУНКЦИЯ__, или __МЕТОД__, или даже __TRAIT__, за исключением того, что ни один из них не дает ожидаемого результата, поэтому кто-нибудь знает способ получить эту информацию, не передавая ее функции в качестве параметра и приводя к хакерский код? Возможно, в PHP 5.6 нужно добавить новую магическую константу __AS__ или скорректировать результат __TRAIT__. , я не понимаю, почему __TRAIT__ и __FUNCTION_ должны возвращать одну и ту же информацию (или почти та же информация). Любая помощь была бы потрясающей, если бы это был нетрадиционный хакерский метод, мне интересно посмотреть мои варианты, пока я не смогу открыть отчет об ошибке с php по этому поводу. (если это действительно баг)

изменить:

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

 debug_backtrace()[0]['function']

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


person NinjaKC    schedule 29.09.2013    source источник
comment
Вы когда-нибудь находили ответ на этот вопрос? У меня такой же вопрос.   -  person diolemo    schedule 10.01.2015


Ответы (2)


Это решение, которое я в итоге использовал. Это не очень хорошо, но, вероятно, лучше, чем использование функции 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(); 
    }

}

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

person diolemo    schedule 10.01.2015

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

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

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

person y o    schedule 29.07.2015