ФорумПрограммированиеPHP для идиотов → класс для подключения других классов

класс для подключения других классов

  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 28 февраля 2010 г. 11:58

    Надоело мне подключать классы таким образом
    require_once ('class/class.page.php');
    $page=new Page();

    хочу подключать хотя бы так

    $page = $lc->connect("class.page.php","Page");


    Может кто то знает еще более лучший способ, не стесняемся, а делимся =)

    ну так вот, написал тот такую примитивную фигню

    class Lc
    {
    public $temp="class/";//папка с классами


    function __construct($temp=NULL)
    {
    if($temp!=NULL)
    $this->temp=$temp;
    }
    /**
    * Подключает класс и возвращает объект
    * @param $nameFile имя файла содержащего класс
    * @param $nameClass название класса
    * @param $construct
    * @return obj
    */
    function connect ($nameFile=NULL,$nameClass=NULL,$construct=NULL)
    {

    if($nameClass!=NULL&&$nameFile!=NULL)
    {
    require_once($this->temp.$nameFile);
    $class = new $nameClass($construct);
    return $class;
    }
    }
    }

    В принципе пока мне достаточно, но вот проблема! Не могу придумать как передавать несколько параметров в конструктор.


    Яже человек темный, кто как это реализует? Может вообще не заморачиваться и подключать по старому?
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 28 февраля 2010 г. 12:03, спустя 5 минут 27 секунд

    spl_autoload_register?
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 28 февраля 2010 г. 12:08, спустя 4 минуты 17 секунд

    автолоад не катит?
    adw/0
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 28 февраля 2010 г. 12:35, спустя 27 минут 23 секунды

    Яж говорю, я темный =)

    Ща почитаю, спасибо =)
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 28 февраля 2010 г. 14:43, спустя 2 часа 8 минут 17 секунд

    Как это все работает?

    если не сложно, Очень кратко объясните для чего каждая функция нужна
    spl_autoload_call
    spl_autoload_extensions
    spl_autoload_functions
    spl_autoload_register
    spl_autoload_unregister
    spl_autoload

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

    function connect ($nameFile=NULL,$nameClass=NULL,$construct=NULL)
    {
    spl_autoload_extensions('.php');
    set_include_path($this->temp);
    spl_autoload($nameClass);
    $ins = new $nameClass;
    return $ins;
    }

    Спустя 110 сек.
    сдается мне что я все не правильно деаю =(
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 28 февраля 2010 г. 14:58, спустя 15 минут 15 секунд

    Professor,
    function __autoload($class_name) {

           $filename = strtolower($class_name) . '.php';
           $file = site_path . 'my_classes' . DIRSEP . $filename;
           if (file_exists($file) == false) {
                   return false;
           }
           include ($file);

    }

    вот [small]мой[/small] автолоад :)
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 28 февраля 2010 г. 14:46, спустя 23 часа 47 минут 47 секунд

    А в конструктор как переменные передаешь? Или хрен с ним с конструктором? =)
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 28 февраля 2010 г. 14:56, спустя 9 минут 37 секунд

    бегло просмотрел первый пост прочитай еще про шаблон проектирования Singleton(ошибся тут)Registry
    Спустя 60 сек.

    А в конструктор как переменные передаешь? Или хрен с ним с конструктором? =)
    не автолоад сам будет искать класс в заданных папках (например можно указать еще кучу папок), когда будет натыкаться на создание *неизвестного* ему объекта
    Спустя 86 сек.
    require_once ('class/class.page.php');
    $page=new Page();

    заменяется обычным подключением/инклудом (как у меня) файла с автолоад функцией.
    и просто набираешь

    $page=new Page();
    Спустя 138 сек.
    вот вообщем читай на php.net
    http://php.net/manual/en/language.oop5.autoload.php
    Спустя 133 сек.
    и еще повтрю слова Старого Мавра, книга Мартина Фаулера Архитектура корпоративных программных приложений (Patterns of Enterprise Application Architecture) вправляет мозги :)
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 28 февраля 2010 г. 15:08, спустя 11 минут 55 секунд

    Книжку обязательно почитаю =)
    Но я к тому что я не хочу все время писать

    spl_autoload("Page");
    $page=new Page();

    Или от этого не уйдешь?
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 28 февраля 2010 г. 15:14, спустя 5 минут 54 секунды


    Книжку обязательно почитаю =)
    Но я к тому что я не хочу все время писать

    spl_autoload("Page");
    $page=new Page();

    Или от этого не уйдешь?

    я тебе про другое…
    вот рпо что я тебе http://php.net/manual/en/language.oop5.autoload.php
    это магическая функция для динамической загрузки классов.
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 28 февраля 2010 г. 15:14, спустя 32 секунды

    Singleton(ошибся тут)Registry

    вот ты гад =) заставляешь меня в 2 часа ночи читать не нужные вещи! Сидел ща и 20 минут втыкал к чему тут Singleton =)
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 28 февраля 2010 г. 15:20, спустя 6 минут

    функцию автолоад достаточно один раз запустить…
    потом можно объявлять сколько хочешь :)потом не требуется объявлять ее перед созданием объекта.
    ну допустим перед запуском "ядра" у меня есть файл init.php в котором я задаю всякие разные константы и делаю нужные мне действия для загрузки ядра, вот в этом файлике и можно разместить эту функцию, и потом уже из ядра просто писать
    $db=new Database();
    $page=new Page();
    Спустя 26 сек.

    Singleton(ошибся тут)Registry

    вот ты гад =) заставляешь меня в 2 часа ночи читать не нужные вещи! Сидел ща и 20 минут втыкал к чему тут Singleton =)
    ну все равно, мне кажется он тоже пригодиться… :)
    Спустя 78 сек.
    вот а2д2 описывал свой регистри, почитай… http://pyha.ru/forum/topic/3954.0
    Спустя 54 сек.
    а вот Мавр уже дал свой автолоад и регистри http://pyha.ru/forum/topic/3954.msg82256#msg82256
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 28 февраля 2010 г. 15:34, спустя 13 минут 56 секунд

    функцию автолоад достаточно один раз запустить…
    потом можно объявлять сколько хочешь :)потом не требуется объявлять ее перед созданием объекта.
    ну допустим перед запуском "ядра" у меня есть файл init.php в котором я задаю всякие разные константы и делаю нужные мне действия для загрузки ядра, вот в этом файлике и можно разместить эту функцию, и потом уже из ядра просто писать

    $db=new Database();
    $page=new Page();

    Нет, ты не прав. Для каждого класса ее нужно 1 раз запустить, так? так!
    В ядре этого нельзя делать по 1 простой причине это подключаются модули, а ядро не может(не должно за ранее знать о подключаемых модулях, иначе они автоматом становятся частью ядра)
    Спустя 290 сек.
    Опять же у мавра
    class Registry{
    private function __construct(){
    }
    public static function getObject($name){
    if (class_exists($name, true))
    return new $name;
    return null;
    }
    }
    $myClass = Registry::getObject("comSitePakageMyClass");

    мы инициируем класс comSitePakageMyClass
    у мне в его конструктор передать параметры нужно. Что делать?

    Уже 15 раз повторяюсь с вопросом =)
    Поду посплю =)
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 28 февраля 2010 г. 15:37, спустя 2 минуты 52 секунды


    Нет, ты не прав. Для каждого класса ее нужно 1 раз запустить, так? так!

    у меня не так :))))
    её нужно запускать один раз, 1, адын раз понимаешь??? :))))
    Поэтому она называется магическая, волшебная функция… бля потести…
    создай index.php
    init.php
    myclass.php

    в init.php
    пропиши автолоад функцию
    function __autoload($class_name) {
    include $class_name . '.php';
    }

    в index.php
    принклюдь init.php
    и создай объект myclass
    а в myclass.php
    напиши заглушку для класса, которая будет что нибудь выводить на экран, что бы виднее было. :)
    Спустя 86 сек.

    Опять же у мавра
    class Registry{
    private function __construct(){
    }
    public static function getObject($name){
    if (class_exists($name, true))
    return new $name;
    return null;
    }
    }
    $myClass = Registry::getObject("comSitePakageMyClass");

    мы инициируем класс comSitePakageMyClass
    у мне в его конструктор передать параметры нужно. Что делать?

    Уже 15 раз повторяюсь с вопросом =)
    Поду посплю =)
    тут он уже использует шаблон Registry он совсем не для этого предназначен.
    Это своего рода коллекция(копилка) созданных объектов… далее в википедии подробно расписано :)
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 28 февраля 2010 г. 15:44, спустя 6 минут 57 секунд

    Пиздец какой-то… лучше пойду спать
    adw/0

Пожалуйста, авторизуйтесь, чтобы написать комментарий!