Электропроводка классах в PHP


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

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

Структура текущего каталога:

enter image description here

Статический класс, я использую это, чтобы сделать мои занятия (поставщики, я их называю):

<?php declare(strict_types = 1);

namespace App;

class App {
    private static $providers = array();

    public static function getProvider($provider) {
        if (!isset(self::$providers[$provider])) {
            $providerName = 'App\Providers\\' . $provider;
            self::$providers[$provider] = new $providerName();
        }

        return self::$providers[$provider];
    }
}

Пример, как я использую его, я делаю это во всех моих контроллеров, чтобы показать вид:

<?php declare(strict_types = 1);

use App\App;

namespace App\Controllers\Frontend\Guest;

class LoginController 
{
    public function getView() 
    {
        \App\App::getProvider('Template')->renderTemplate('index.html');
    }
}

Вот одна из моих немногих поставщиков:

<?php declare(strict_types = 1);

namespace App\Providers;

class Template {
    private $twig;

    public function __construct() {
        $this->twig = new \Twig_Environment(new \Twig_Loader_Filesystem(ROOT . '/resources/templates'), array(
            'cache' => ROOT . '/storage/cache/templates',
        ));
    }

    public function renderTemplate($template) {
        echo $this->twig->render($template, array('the' => 'variables', 'go' => 'here'));
    }
}


153
2
задан 12 февраля 2018 в 04:02 Источник Поделиться
Комментарии
1 ответ

Выглядит как будто вы пытаетесь достичь паттерн Singleton, используя приложение класс, чтобы контролировать их все. Вместо того, чтобы попробовать такой подход:

<?php
// Base / abstract class that defines a basic singleton pattern
abstract class SingletonProvider
{
// Singleton pattern
protected static $_instance;
public static function getInstance()
{
if(static::$_instance == null)
{
static::$_instance = new static();
}
return static::$_instance;
}

// Private constructor
private function __construct() { }
}

// A specific provider class definition that inherits the singleton pattern
class MyProvider extends SingletonProvider
{
// Class-specific instance reference
protected static $_instance;

// --- CLASS INSTANCE-SPECIFIC PROPERTIES AND METHODS BELOW HERE ---

// Class properties
public $FieldX;

protected function __construct()
{
$this->FieldX = "Hello World!";
}
}

// Another specific provider class definition that inherits the singleton pattern
class MyOtherProvider extends SingletonProvider
{
// Class-specific instance reference
protected static $_instance;

// --- CLASS INSTANCE-SPECIFIC PROPERTIES AND METHODS BELOW HERE ---

// Class properties
public $FieldY;

protected function __construct()
{
$this->FieldY = "Foo";
}

public function MakeMoreExciting($sentence)
{
return $sentence . "!!!!!!!!";
}
}

// Usage examples
echo MyProvider::getInstance()->FieldX; // Hello World!
echo MyOtherProvider::getInstance()->FieldY; // Foo
echo MyOtherProvider::getInstance()->MakeMoreExciting("Hi there"); // Hi there!!!!!!!!

"Статический" ключевое слово используется для позднего статического связывания, который в основном означает, что при запуске MyOtherProvider::деыпзьапсе(), все "статический" ссылки вроде "статический::$_instance" разрешить вызывающему классу, так как автоматически определить либо MyOtherProvider::$_instance или MyProvider::$_instance, в зависимости от того, какой класс вызывается.

Защищенные статические $_instance там, чтобы гарантировать, что каждый класс имеет свои собственные свойства, чтобы держать экземпляр класса.

В теории, можно даже сократить все это до ничего, кроме статических методов и свойств, тоже:

abstract class MyOtherProvider
{
// Class properties
public static $FieldY;

public static function MakeMoreExciting($sentence)
{
return $sentence . "!!!!!!";
}
}

echo MyOtherProvider::MakeMoreExciting("Hi there"); // Hi there!!!!!!

Хотя иногда может потребоваться реальный экземпляр, а не просто быть полностью статичным.

2
ответ дан 12 февраля 2018 в 08:02 Источник Поделиться