Если еще, если условие не работает должным образом

test.php

<?php

$a = 'D:/mydomain/Slim/Lib/Table.php';
$b = '\Slim\Lib\Table';

foreach (array($a, $b) as $value)
{
    if (file_exists($value)) 
    {
        echo "file_exist";
        include_once($value);
        new Table();
    }
    else if (class_exists($value))
    {
        echo "class_exist";
        $class = new $value();
    } 
    else
    {
        echo "error";
    }
}
?>

и D:/mydomain/Slim/Lib/Table.php

<?php
class Table {

    function hello()
    {
        echo "test";
    }

    function justTest()
    {
        echo "just test";
    }

}
?>

Когда я выполняю test.php в браузере, результат будет:

file_exist Фатальная ошибка: невозможно переопределить класс Table в D:/mydomain/Slim/Lib/Table.php в строке 2

если оператор для class_exist не является триггером. Пространство имен \Slim\Lib\Table никогда не существует.

2 ответа

Первый if может быть изменен на:

if (! class_exists ($ value) && file_exists ($ file)

На самом деле есть и другие проблемы:

$a = 'D:/mydomain/Slim/Lib/Table.php';
$b = 'Table'; //Since you don't have a namespace in the Table class...
//This ensures that the class and table are a pair and not checked twice
foreach (array($a=>$b) as $file=>$value) 
{
    if (!class_exists($value) && file_exists($file)) 
    {
        echo "file_exist";
        include_once($file);
        $class = new $value();
    }
    else if (class_exists($value))
    {
        echo "class_exist";
        $class = new $value();
    } 
    else
    {
        echo "error";
    }
}

Второй необязательный параметр class_exists является bool $autoload = trueпоэтому он пытается автозагрузить этот класс. Попробуйте изменить этот вызов на class_exists( $value, false) Смотрите руководство.

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