Вопрос по object, static, php – Узнайте, существует ли метод в статическом классе

34

Я хочу проверить, существует ли функция в создаваемой мной библиотеке, которая является статической. Я видел функцию и method_exists, но не нашел способа, который позволил бы мне вызывать их в относительном контексте. Вот лучший пример:

class myClass{
    function test1()
    {
        if(method_exists("myClass", "test1"))
        {
            echo "Hi";
        }
    }
    function test2()
    {
        if(method_exists($this, "test2"))
        {
            echo "Hi";
        }
    }
    function test3()
    {
        if(method_exists(self, "test3"))
        {
            echo "Hi";
        }
    }
}
// Echos Hi
myClass::test1();
// Trys to use 'self' as a string instead of a constant
myClass::test3();
// Echos Hi
$obj = new myClass;
$obj->test2();

Мне нужно иметь возможность сделать тест 3 эхо Привет, если функция существует, без необходимости вынимать ее из статического контекста. Для ключевого слова для доступа к классу должно быть «self», так как $ это для назначенных классов.

Почему метода test1 () недостаточно? gapple
Потому что я хочу поместить это в класс, который будет расширен несколькими классами. Я мог бы использовать магическую константу для достижения этой цели, но должен быть более простой способ. Tyler Carter

Ваш Ответ

3   ответа
-1

для всех ситуаций & # x2026; наилучшее использование будет & # x2026;

if method_exist(…) && is_callable(…)

Для примера тестирования:

class Foo {
  public function PublicMethod() {}
  private function PrivateMethod() {}
  public static function PublicStaticMethod() {}
  private static function PrivateStaticMethod() {}
}

$foo = new Foo();

$callbacks = array(
  array($foo, 'PublicMethod'),
  array($foo, 'PrivateMethod'),
  array($foo, 'PublicStaticMethod'),
  array($foo, 'PrivateStaticMethod'),
  array('Foo', 'PublicMethod'),
  array('Foo', 'PrivateMethod'),
  array('Foo', 'PublicStaticMethod'),
  array('Foo', 'PrivateStaticMethod'),
);

foreach ($callbacks as $callback) {
  var_dump($callback);
  var_dump(method_exists($callback[0], $callback[1])); // 0: object / class name, 1: method name
  var_dump(is_callable($callback));
  echo str_repeat('-', 40), "n";
}

ИсточникВот

55

static::class доступно с версии PHP 5.5 и возвращает & quot;Позднее статическое связывание& Quot; имя класса:

class myClass {
    public static function test()
    {
        echo static::class.'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // should print "subClass::test()"

get_called_class() делает то же самое, и был введен в PHP 5.3

class myClass {
    public static function test()
    {
        echo get_called_class().'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // should print "subClass::test()"

get_class() Функция, которая начиная с php 5.0.0 не требует каких-либо параметров, если она вызывается внутри класса, возвращает имя класса, в котором была объявлена функция (например, родительский класс):

class myClass {
    public static function test()
    {
        echo get_class().'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // prints "myClass::test()"

__CLASS__ magic constant делает то же самое [ссылка на сайт].

class myClass {
    public static function test()
    {
        echo __CLASS__.'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // prints "myClass::test()"
Я искал способ проверить, существует ли статический метод в родительском классе, и этот ответ привел меня к тому, чтоget_parent_class() работает так же, когда вызывается без каких-либо параметров. Спасибо!
Просто запискаstatic::class делает так же, какget_called_class() а такжеself::class делает так же, какget_class() но они доступны только с PHP 5.5
Благодарю вас! Это было именно то, что я искал. Tyler Carter
2

Update:

Ааа, извинения. Я был временно слепым :) Вы хотите использовать магическую константу __CLASS__

например

if (method_exists(__CLASS__, "test3")) { echo "Hi"; }
Вы подразумеваете из комментариев, что я "просто" поставить на главный вопрос? Tyler Carter
Идея состоит в том, что мне не нужно имя класса, и поэтому я могу поместить метод в любой класс, и он должен работать независимо от того, назначен класс или нет. Tyler Carter
этот ответ, по-видимому, совпадает с методом test1 () примера вопроса с использованием method_exists () с именем класса, переданным в виде строки
Если вашей целью является расширяемость, следует отметить, что__CLASS__, __TRAIT__, __FILE__, etc в явном виде возвращает имя класса / признака / файла, в котором используется константа, тогда как, если вы хотите учесть дочерние объекты, вы захотитеget_class($this) для созданных объектов, илиget_called_class() для статических классов / методов для отслеживания наследования. Затем вы можете поместить одну функцию в черту или базовый класс и использовать ее везде, тем самым предотвращая проблемы с дублированием кода, и использоватьinstanceof [черта, родительский класс или интерфейс] илиmethod_exists() для проверки без дубликата кода.
Я не понимаю вопроса. Я вижу, вы обновили свой комментарий в ОП: "Я мог бы использовать волшебную константу для достижения этой цели, но должен быть более простой способ". Я не видел это, прежде чем я обновил свой ответ. Что не так просто в данном методе?

Похожие вопросы