Как я могу запустить php-файл из командной строки, который использует класс из другого пространства имен?

#php #composer-php

#php #композитор-php

Вопрос:

Я пытаюсь создать файл, который вы можете выполнить из командной строки для создания таблиц в базе данных. Проблема в том, что этот файл использует класс из другого пространства имен, поэтому, когда я пытаюсь запустить php migrations.php , я получаю Fatal error: Uncaught Error: Class "CoreDatabaseDatabase" not found in C:UsersuserDesktopappmigrations.php:6 .

Я использую автозагрузчик composer, и у меня нет проблем с другими файлами — это происходит только тогда, когда я пытаюсь выполнить указанный файл из командной строки.

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

migrations.php

 <?php

use CoreDatabaseDatabase;

Database::query("CREATE TABLE real_estates(
    id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    city_id INT(11) NOT NULL,
    area INT(11) NOT NULL,
    price INT(11) NOT NULL,
    description TEXT NOT NULL,
    CONSTRAINT `fk_real_estate_city`
        FOREIGN KEY (city_id) REFERENCES cities (id)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT
)");

Database::query("CREATE TABLE cities(
    id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL
)");

 

composer.json

 {
  "autoload": {
    "classmap": [
      "./"
    ]
  },
  "require": {
    "ext-pdo": "*"
  }
}
 

Комментарии:

1. Скорее всего, вам нужно написать дополнительный автозагрузчик для пользовательских пространств имен. Необязательно, если это один внешний класс, просто перейдите к require_once() нему.

2. Где именно вы используете автозагрузчик?

Ответ №1:

Вам нужно require вручную загрузить файл автозагрузки композитора, обычно это делается вашим веб-приложением.

 require_once  pathOfComposerAutoloadFile.php
 

Комментарии:

1. Ах, да. Мне действительно требовалось это в моем index.php , но я забыл сделать это в упомянутом файле. Спасибо!

Ответ №2:

Создать autoload.php и включите все необходимые файлы в этот файл, например….

 include(__DIR__ . 'yourfile.php');
 

Используйте это autoload.php в вашем migration.php досье.
Теперь ты можешь бежать migration.php из URL-адреса или командной строки.