2015-11-16 2 views
0

Хорошо, я думаю, что у меня есть что-то здесь ...Невозможно сравнить магическую константу __METHOD__

Внутри класса, им пытается кондиционировать частные функции на основе имени использованную метода.

Поэтому код выглядит примерно так:

<?php 
class my_class{ 

public function my_method($arg1) { 
    $this->private_function($arg1); 
} 

private function private_function($arg2){ 
    if (__METHOD__ == "my_class::my_method"){ 
    #THIS FAILS 
    }else{ 
    #THIS WORKS 
    } 
    return; 
} 
} 

(new my_class())->my_method($something); 

Если я делаю var_dump() на __METHOD__ на том же уровне им пытаются использовать его я получить хороший string(19)"my_class::my_method". Поэтому я сравниваю строку с другой.

Следующая также не будет:

  • Cast как ВАР в строку и сравнить их.
  • Скопировать __METHOD__ в (string) $var и сравнить их.
  • Верхние обе строки и сравнить их.
  • Использование одинарных кавычек для текста.

Я мог бы быть неправильно, но я думаю, что я ударил ошибка здесь :(

PHP версии 5.6.1 - Win

+0

Я попробовал '$ a = __METHOD__; echo $ a === __METHOD__? 1: 2; ', он печатает' 1' – Andrew

+1

'__METHOD__' должен быть' my_class :: private_function' –

+0

Я обновил его, чтобы отразить вызванный метод ... – Solrac

ответ

0

__METHOD__ возвращает имя метода текущего класса. В вашем случае это my_class::private_function.

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

class my_class { 

    public function my_method($arg1) { 
     $this->private_function($arg1, __METHOD__); 
    } 

    private function private_function($arg2, $caller) { 
     if ($caller == "my_class::my_method") { 

     } else { 

     } 
     return; 
    } 
} 
+0

В моем сознании __METHOD__ имел значение публичной функции, но я все понял неправильно ... Спасибо @chumkiu Я думаю, мне нужно немного поспать: P – Solrac

+0

было бы лучше использовать 'debug_backtrace', чтобы получить вызывающего абонента имя метода, поэтому каждый раз, когда используется 'private_function', нам не нужно добавлять второй аргумент вызывающему, и нужно только сосредоточиться на' private_function' ?? просто мое скромное мнение – Andrew

+0

это никогда не рекомендуется использовать функцию с префиксом 'debug' в среде разработки не :). Более чистый способ - передать функции все, что нужно для выполнения своей работы. Также должно быть более объяснимо имя функции. –

0

Вы должны попробовать __FUNCTION__ я думаю __METHOD__ возвратит имя класса наряду с именем функции.

+0

'__FUNCTION__' вернет' private_function' вместо вызываемого метода, который является 'my_class :: my_method' – Solrac

+0

Да! Ты прав. :) –