Как расширить класс PHP в нескольких файлах и пометить каждое расширение в пространстве имен? - PullRequest
1 голос
/ 22 июня 2019

У меня есть следующий код:

Файл: class.engine.php (Основной движок сайта)

<?php
namespace Core;

class Engine {

}

Файл class.errors.php (Ошибка запуска, если что-то происходит, настраиваемые ошибки)

<?php
namespace Core\Errors;

class Errors {
    public function TrigerError($e)
    {
        die($e);
    }
}

Файл class.mysqli.php (Коннектор базы данных)

<?php
namespace Core\MySQLiDrv;

class MySQLiDrv {
    public $db = null;

    public function __construct($database) {
        $connector = mysqli_connect($database[0], $database[1], $database[2], $database[3]);
        if(!$connector)
        {
            return new TrigerError("1");
        }
    }
}

Файл index.php (где все работает)

<?php
include("engine/class.engine.php");
include("engine/class.errors.php");
include("engine/class.mysqli.php");

$engine = new Engine();
$db = new MySQLiDrv(array("localhost", "user", "pass", "db"));

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

И важно ли в этом случае кода использовать пространства имен, определенные как нечто для простоты использования?

1 Ответ

2 голосов
/ 23 июня 2019

Ваша основная проблема, как я вижу, это отсутствие оператора USE и тот факт, что TrigerError является методом, а не классом.

Чтобы исправить это:

namespace Core\MySQLiDrv;

use Core\Errors\Errors;

class MySQLiDrv {
    public $db = null;

    public function __construct($database) {
        $connector = mysqli_connect($database[0], $database[1], $database[2], $database[3]);
        if(!$connector)
        {
            return (new Errors)->TrigerError("1");
        }
    }
}

Полный рабочий код:

namespace Core{
    class Engine {
    }
}

namespace Core\Errors{
    class Errors {
        public function TrigerError($e)
        {
            die($e);
        }
    }
}

namespace Core\MySQLiDrv{

    use Core\Errors\Errors;

    class MySQLiDrv {
        public $db = null;

        public function __construct($database) {
            //$connector = mysqli_connect($database[0], $database[1], $database[2], $database[3]);
            //if(!$connector)
            //{
                return (new Errors)->TrigerError("1");
           //}
        }
    }
}

//default global namesapce
namespace {
    use Core\Engine;
    use Core\MySQLiDrv\MySQLiDrv;

    $engine = new Engine();
    $db = new MySQLiDrv(array("localhost", "user", "pass", "db"));

}

Выход

1

Песочница

Единственное реальное отличие состоит в том, что при использовании нескольких пространств имен водин файл (песочница) вы должны заключить в код с {}.Вы можете удалить их, если это отдельные файлы.Хорошо, и я не могу использовать функции DB в песочнице, но это не имеет значения в этом примере, потому что мы хотим вызвать ошибку.

Однако, как сказано в комментариях, я бы посмотрел на Autoloading и Exceptions и то, и другое поможет вам в этом.

У меня есть автозагрузчик на github , с которым вы можете поэкспериментировать, если хотите, это похоже на то, что Composer использует / делает.Композитор просто более стандартизирован.

Autoloadig в основном использует комбинацию пространства имен и класса для поиска файла во время выполнения (когда создается экземпляр класса).Так что есть некоторые соглашения об именах, о которых нужно знать, например, возьмите ваш класс Core\Errors\Errors, он должен находиться в Core/Errors/Errors.php Пространство имен и путь к файлу должны быть одинаковыми.Это означает, что вы можете исключить все операторы включения, и это автоматически загружает файлы, когда это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...