PHP: невозможно объявить класс, потому что имя уже используется
У меня есть 5 скриптов, скажем: database.php, parent.php, child1.php, child2.php и somescript.php
Класс parent.php выглядит следующим образом:
include 'database.php';
class Parent {
public $db;
function __construct() {
$this->db = new Database();
}
}
child1 и child2 классы выглядят следующим образом:
include 'parent.php';
class Child1 extends Parent {
function __construct() {
parent::__construct();
}
function useDb() {
$this->db->some_db_operation();
}
}
Проблема
Когда я пытаюсь включить child1 и child2 в somescript.php, он возвращает следующую ошибку:
не может объявить базу данных класса, поскольку имя уже используется в database.php в строке 4 (это строка, содержащая базу данных классов слов)
Но если я включаю только один файл (child1 или child2), он отлично работает.
Как это исправить?
Ответы
Ответ 1
вы хотите использовать include_once() или require_once(). Другой вариант - создать дополнительный файл со всеми вашими классами в правильном порядке, чтобы их не нужно было включать:
"classes.php"
include 'database.php';
include 'parent.php';
include 'child1.php';
include 'child2.php';
Тогда вам просто нужно:
require_once('classes.php');
Ответ 2
попробуйте использовать include_once
или require_once
вместо include
или require
Ответ 3
Другой вариант include_once или require_once - использовать автозагрузку классов. http://php.net/manual/en/language.oop5.autoload.php
Ответ 4
У меня была эта проблема раньше, и чтобы исправить это,
Просто убедитесь:
- Вы не создали экземпляр этого класса до
- Если вы вызываете это из метода класса, убедитесь, что __destruct установлено в классе, из которого вы вызвали.
Моя проблема (до):
У меня был класс: Core, Router, Permissions и Render
Ядро включает в себя класс Router, затем Router вызывает класс Permissions, затем Router __destruct вызывает класс Render, и появляется сообщение об ошибке "Невозможно объявить класс, так как имя уже используется".
Решение:
Я добавил __destruct для класса Permission, и __destruct был пуст, и он исправил...