Переопределение основных классов - PullRequest
2 голосов
/ 29 марта 2011

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

Так, в качестве примера, это моя текущая файловая структура (упрощенная, без 'customer_slug')

  • приложение
    • ядро
      • User.php (класс User)
    • заказ
      • User.php (класс User)

Теперь я хочу проверить, существует ли «custom / User.php», и, соответственно, включить и использовать это. Следует расширить основной (абстрактный) класс пользователя.

Мой скрипт "entry" сейчас выглядит так:

<?php

function __autoload($class_name) {
    $dispatch = Dispatcher::getInstance();
    $dispatch->get($class_name);
}

class Dispatcher {

    private static $instance;
    private static $customer_slug = 'sony';

    private function __clone() {
        // Empty magic function to prevent cloning
    }

    private function __construct() {
        // Empty magic function to prevent initialization
    }

    public static function getInstance() 
    {
        if (!isset(self::$instance)) {
            $class = __CLASS__;
            self::$instance = new $class;
        }

        return self::$instance;
    }   

    public static function get($class) {
        // Autoload class
        $basepath = $class.'.php';

        // Include bas class
        include('core/'.$basepath);

        // Do we have custom functionality
        if (file_exists('custom/'.self::$customer_slug.'/'.$basepath)) {
            include('custom/'.self::$customer_slug.'/'.$basepath);
        } 
    }
}

$User = new User;

print_r($User);

?>

Я пытался поиграться с пространствами имен, но не могу заставить его работать. Я хотел бы продолжать говорить «$ user = new User;». Не знаю, как еще я мог бы назвать класс, возможно, $ user = new $ custom_or_code_classname

Так что я открыт и для других подходов. Может, система крючков?

1 Ответ

2 голосов
/ 12 августа 2013

Мы реализовали решение для этого с помощью __autoload ().В основном у вас есть 2 переменные, одна для «приложения» и одна для «клиента».Затем вы структурируете свои классы в соответствующие каталоги.Например,

classes/app1/User.php
classes/app2/User.php
classes/app1/client1/User.php

и т. д.

Затем в автозагрузке fxn вы создаете массив возможных путей.при условии, что app1, client1, array будут иметь вид:

$paths = array('classes/app1/client1/User.php', 'classes/app1/User.php', 'classes/User.php');

Затем выполните итерацию по поиску file_exists () и вызову require_once ().

Все сами классы должны быть названы в зависимости от места ихlive:

class User__client1__app1 extends User__client1
class User__client1 extends User__base
class User__base

Таким образом, сложная часть эффективно совмещает правильное имя с корневым именем (Пользователь).

В автозагрузчике, после того как вы нашли подходящий класс, выполните:

eval("class User extends $found_class { }");
...