Как безопасно и динамически создать экземпляр существующего класса PHP? - PullRequest
1 голос
/ 06 сентября 2010

Скажите, у меня есть файл Foo.php:

<?php
interface ICommand
{
     function doSomething();
}

class Foo implements ICommand
{
    public function doSomething()
    {
        return "I'm Foo output";
    }
}

?>

Если я хочу создать класс типа Foo, я мог бы использовать:

require_once("path/to/Foo.php") ;
$bar = new Foo(); 

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

register("Foo", "path/to/Foo.php");

function register($className, $classPath)
{
    require_once($classPath); //Error if the file isn't included, but lets 
                              //assume that the file "Foo.php" exists.
    $classInstance = new $className; //What happens here if the class Foo isn't 
                                     //defined in the file "Foo.php"? 

    $classInstance->doSomething(); //And what happens here if this code is executed at
                                   //all?
    //Etc...
}

Как мне убедиться, что эти классы действительно находятся там, где в конфигурационном файле написано, что они есть? И что произойдет, если класс не существует (но файл есть), создаст ли он экземпляр динамически сгенерированного класса, который не имеет дальнейшего описания?

Ответы [ 2 ]

4 голосов
/ 06 сентября 2010

Вы можете использовать class_exists , чтобы проверить, определен ли класс.

Если вы вызываете класс динамически, а также вызываете метод этого класса из той же функции, выВы также можете вызывать этот метод динамически (если только у всех ваших классов нет одного и того же метода. Если это так, вы также можете использовать method_exists

Наконец, вы также можете использовать file_exists , чтобы обеспечить включение файла:

register("Foo", "path/to/Foo.php", "bar", array('arg1', 'arg2'));

function register($className, $classPath, $methodName, $args)
{
    if(!file_exists($classPath)) return false;

    require_once($classPath);

    if(!class_exists($className)) return false;

    $classInstance = new $className;

    if(!method_exists($classInstance, $methodName)) return false;

    $classInstance->$methodName($args);
}
1 голос
/ 06 сентября 2010

Если вы пытаетесь создать экземпляр класса, который не определен, например,

$o = new IsNotDefined();

, то автозагрузчик вызывается, и имя класса передается в качестве параметра.Если зарегистрированный автозагрузчик обеспечивает реализацию класса, сценарий продолжается "нормально".Если реализация класса не может быть предоставлена, php останавливается с Fatal error: Class 'IsNotDefined' not found.

. Вас также может заинтересовать

...