Внезапно я не могу динамически создать класс. Я могу создать экземпляр, если я вызываю его напрямую, но вызов его с переменной не будет работать. Вот что не работает:
$database_class = 'MysqlConnection'; $class = new MysqlConnection(); $other_class = new $database_class();
Первый экземпляр, создающий $class
, отлично работает. Второй, делающий $other_class
, терпит неудачу и дает следующую ошибку:
PHP Неустранимая ошибка: класс «MysqlConnection» не найден в /pronounce-php/src/Database/Connect.php в строке 47
Что я здесь делаю неправильно? Heres весь файл, если это помогает:
<?php namespace PronouncePHP\Database; use Symfony\Component\Console\Output\OutputInterface; use PronouncePHP\Database\Connection\MysqlConnection; class Connect { private $config; /** * Construct * * @return void */ public function __construct() { $this->config = include('config.php'); } /** * Get database connection * * @return Connection */ public function getDatabaseConnection($output) { $database_type = $this->getDatabaseType($output); $database_class = $this->makeConnectionClass($database_type); $connection_information = $this->getConnectionInformation($database_type); // if (!class_exists($database_class)) // { // $output->writeln("<error>Database type not found!</error>"); // $output->writeln("<comment>Please ensure that the database type is specified and that it is supported</comment>"); // $GLOBALS['status'] = 1; // exit(); // } $database_class = "MysqlConnection"; $class = new MysqlConnection(); $other_class = new $database_class(); } /** * Get database type specified in config file * * @return string */ public function getDatabaseType($output) { $database_type = $this->config['database']; if (is_null($database_type)) { $output->writeln("<error>No database type specified in config.php</error>"); $GLOBALS['status'] = 1; return null; } return $database_type; } /** * Make class name for connection * * @return string $database_type */ public function makeConnectionClass($database_type) { return ucfirst($database_type) . 'Connection'; } /** * Get connection information for specified database type * * @return string $database_type */ public function getConnectionInformation($database_type) { $information = $this->config['connections'][strtolower($database_type)]; return $information; } }
Фактическое имя класса – PronouncePHP\Database\Connection\MysqlConnection
. Поскольку вы наложили это на верхнюю часть файла, вы можете ссылаться на него как на MysqlConnection
используя литералы. Это потому, что литералы фиксируются в буквальном объеме, а разрешение имен однозначно.
Тем не менее, строки в переменных могут поступать из любого места в любое время и, следовательно, не могут быть реалистично разрешены против use
операторов. Если вы хотите использовать имя в виде строковой переменной, вам необходимо использовать полное имя:
$database_class = 'PronouncePHP\Database\Connection\MysqlConnection';