Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП, работа с классами 
V
    Опции темы
MoLeX
  Дата 10.6.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Привет.

Пытаюсь из основного класса (CORE) вызвать класс test (используя ф-кцию load_class ) и в будущем обращаться к тестовому классу так
Код

$this->test->class_test();


но пока что могу обратиться тока так
Код

echo test::class_test();




index.php
Код

<?php
function &load_class($class)
{
    static $objects = array();

    if( isset($objects[$class]) )
    {
        return $objects[$class];
    }
    else
    {
        if( file_exists($class.'.php') )
        {
            require_once $class.'.php';
                
            $objects[$class] =& new $class();            
            return $objects[$class];
        }
        else
            return FALSE;
    }
}



class load{
    
    public function library($library = '', $params = NULL)
    {
        if( $library == '' )
        {
            return FALSE;
        }
        
        if( ! is_null($params) AND ! is_array($params) )
        {
            $params = NULL;
        }
        
        require $library.'.php';

        $lib =& new $library();
        return $lib;
    }
}



class CORE{
    
    public function __construct()
    {    
        $this->load =& load_class('load'); 
        $this->load->library('test');

        echo test::class_test().'<br />';
    }
}


$core = new CORE();
?>



test.php
Код

<?php
class test{
    
    public function class_test()
    {
        return '<br />class test<br />';
    }

}
?>


Добавлено через 1 минуту и 1 секунду
не могу понять что не так  smile

Добавлено через 1 минуту и 44 секунды
заодно покажите как правильно надо работать с ООП


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
solenko
Дата 10.6.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



1. Если класс test должен быть синглтоном, то почему эти функции не возложить на него?
2. Почему не используете стандартный механизм autoload?
3. Из конструктора ВСЕГДА возвращается инстанс класса, а не непонятного класса $lib, который вы пытаетесь вернуть. Переопределяется это только на уровне Zend Engyne.
4. Мне непонятна цель всех этих манипуляций. Может вы объясните зачем это все?


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Sanchezzz
  Дата 10.6.2009, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Хм.. наконецто хоть кто то использует такое как и я.  smile 

в основном классе делаешь загрузку класса и кидаешь ее в массив в томже классе
получается такая констркуция 
Код


class mycore {
public $ArrClass;

function loadclass($c){

include $_SERVER['DOCUMENT_ROOT'].'/class/'.$c.".php";
$this->ArrClass[$c] = new $c;
}

}


тока тебе придется сделать проверку если такой класс и подрублен ли он.
проверка если есть такой обьект в массиве то не грузить.

вот и получается такая конструкция
Код

$mycore = new mycore();
$mycore->loadclass('mail');
$mail = $mycore['mail']; // также можно вызвать заново или клонировать класс... $mail = clone $mycore['mail']; или new


минус в том что классы нужно хранить в одной папке и стакимже названием как и файл.



Это сообщение отредактировал(а) Sanchezzz - 10.6.2009, 14:00


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
MoLeX
Дата 10.6.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



solenko, такое реализовано в фр-рке CI (думаю и в остальных тоже есть)
Цитата(solenko @  10.6.2009,  10:50 Найти цитируемый пост)
4. Мне непонятна цель всех этих манипуляций. Может вы объясните зачем это все? 

неа, не могу =)
скорей всего это для того чтобы поумнеть)))


Sanchezzz,  smile 




--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
solenko
Дата 10.6.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



MoLeX, в symfony, zend, prado я что-то такого не встречал. CI, если память не изменяет, писался под php4 => там множество атавизмов.

Зачем все это складировать в хеш в одном классе мне совершенно не понятно.  Для вашего примера __autoload + singleton -- более простое и, что немаловажно, понятное решение. 


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Sanchezzz
  Дата 10.6.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



а вот еше продолжение как сделать так чтобы все классы подрубленые ядром могли из себя обратитсякк ядру вызвать еше классов или использовать функции ядра.. 

достаточно добавить в подрублениеглавного ядра такое. 

такое 
Код

$this->ArrClass[$c] = new $c;
$this->ArrClass[$c]->core = $this; // где this этосылка обьекта...


получается можно использовать такое хр.. и в классах

это гдето в файле ...
Код


class mail {
 function __construct(){
    $this->mail();
}
 function mail(){
   //дефолтные настройки....
} 
 function test1(){
  $this->core->loadclass('testclass');
  $testclass = new $this->core->ArrClass['testclass'];
  $testclass->func1():
}

}

$mycore = new mycore();
$mycore->loadclass('mail');
$mail = $mycore['mail'];
$mail->test1(); //в этой функции мы используем ссылку ядра и его функции + 
//подрубаем класс для класса mail для внутреннего использования


еше раз проверки что такой обьект в главном классе обезательно...

а теперь о минусах и плюсах.

+ некого globals 
+ полностью ООП.
+ можно добавить к главном ядру подключение к БД и передовать индификатар БД.. удобно использовать mysqli
- тупой прогер не поймет о чё это такое...

Эта идея а уже и готовое решение радилось в ответ globals и одной хр СМS не буду говорить как назвается а то реклама, наченается на Би....


Это сообщение отредактировал(а) Sanchezzz - 10.6.2009, 14:31


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
solenko
Дата 10.6.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Цитата(Sanchezzz @  10.6.2009,  13:30 Найти цитируемый пост)
+ некого globals 

От использования глобальных переменных можно отойти и более культурно.

Цитата(Sanchezzz @  10.6.2009,  13:30 Найти цитируемый пост)
+ полностью ООП.

Очень высокая связность классов. mail c testclass в вашем примере вполне могут общаться напрямую без надуманного посредника core.

Цитата(Sanchezzz @  10.6.2009,  13:30 Найти цитируемый пост)
+ можно добавить к главном ядру подключение к БД и передовать индификатар БД.. удобно использовать mysqli

Либо почитайте про паттерн registry либо нифига не понял


Цитата(Sanchezzz @  10.6.2009,  13:30 Найти цитируемый пост)
- тупой прогер не поймет о чё это такое...

Не потому что "тупой", а потому что так делать нет смысла )


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Sanchezzz
  Дата 10.6.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



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

Цитата

+ можно добавить к главном ядру подключение к БД и передовать индификатар БД.. удобно использовать mysqli

хм принцеп действия такойже

Код

class core {
public $db;
public function __construct(){
      $this->db = new mysqli('localhost','root','','BSNAME');
}
}

class mail {
 function __construct(){
    $this->mail();
}
 function mail(){
   //дефолтные настройки....
} 
 function test1(){
  $this->core->loadclass('testclass');
  $testclass = new $this->core->ArrClass['testclass'];
  $testclass->db = $this->core->db; //вот ссылка на обьект
  $testclass->func1():
}

}

хотя соединении с бд лучше делать вне класса потом передавать главному классу а потом уже другим.

Цитата

Не потому что "тупой", а потому что так делать нет смысла )

Убеди почему не стойт делать такое. не удобно?

Жесткая привязка к ядру? нет классы можно и без ядра юзать также.
Просто получается громадная модульная система где все завязано на большом ядре которое можно расширять таким способом.
Если не изобретать нечего нового то так и будем юзать чужие велики.

Это сообщение отредактировал(а) Sanchezzz - 11.6.2009, 08:57


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
solenko
Дата 10.6.2009, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Цитата(Sanchezzz @  10.6.2009,  14:12 Найти цитируемый пост)
когда я начял делать как связывать один класс доступным  для всех то мне кроме глобала тут нечего другого не подсказали globals
да и глобалс я не перевариваю. 

уже в этой теме я дважды упомянул singleton и registry -- не поленитесь таки посмотреть.

По поводу вашего примера с БД -- отдельно стоящий класс testclass должен знать что есть класс DB, что есть класс CORE и что CORE уже инициализировал DB. Потому еще раз повторюсь -- взгляните не сингтон. Тогда testclass должен будет всего лишь знать что DB существует.

Добавлено через 2 минуты и 33 секунды
Цитата(Sanchezzz @  10.6.2009,  14:12 Найти цитируемый пост)
Если не изобретать нечего нового то так и будем юзать чужие велики.

Да изобретайте на здоровье! Но если все делают велосипеды с круглыми, а не квадратными колесами, то может стоит задуматся почему?


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 10.6.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

class CORE{
    
    public function __construct()
    {    
        $this->load =& load_class('load'); 
        $this->test =& load_class('test'); 
        echo $this->test->class_test().'<br />';
    }
}

Может так?

Цитата(solenko @  10.6.2009,  14:30 Найти цитируемый пост)
Зачем все это складировать в хеш в одном классе

Затем, чтобы прозрачно для остального кода делать переопределение "модулей"? Правда для этого ее (функцию) по уму нужно превратить почти в настояший класс smile. Если считать что CORE будет единственным классом, то получается через задницу, по идее нужно пихать функционал load_class в сам CORE и не выпендриваться, но если представить, что этих CORE может быть много разных, то вполне нормальное решение. Чем функция в PHP хуже какого-то там синглтона?

Цитата(Sanchezzz @  10.6.2009,  13:59 Найти цитируемый пост)
минус в том что классы нужно хранить в одной папке и стакимже названием как и файл.


нужно пользоваться изобразительными возможностями языка. Можно регистрировать новые модули-наследники примерно так:
Код

load_class(array(
   'CORE'=>array('myCore','plugins/core/my_real_core.php'),
   'test'=>'myTest',
   'library',
));

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

P.S. люблю я велосипеды!!!



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
icewind
Дата 10.6.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 11.4.2009
Где: Ростов-на-Дону

Репутация: 20
Всего: 20



MoLeX, вам нужно было определить класс, для которого лоадер установил бы свойство. Вот так, утрированно...
Код

<?php
function &load_class($class)
{
    static $objects = array();
    
    if( isset($objects[$class]) )
    {
        return $objects[$class];
    }
    else
    {
        if( file_exists($class.'.php') )
        {
            require_once $class.'.php';
                
            $objects[$class] = new $class();            
            return $objects[$class];
        }
        else if( class_exists($class) )
        {
         $objects[$class] = new $class();
         return $objects[$class];
        }
    }
}

function &get_root()
{
    return root::get_root();
}

class root
{
    private static $inst;
    public function __construct()
    {
        self::$inst = $this;
    }
    public static function &get_root()
    {
        return self::$inst;
    }
}

class LoaderClass
{   
    public function library($library = '', $params = NULL)
    {
        if( $library == '' )
        {
            return null;
        }
        
        if( ! is_null($params) AND ! is_array($params) )
        {
            $params = NULL;
        }
        if( file_exists($library.'.php') )
        {
            require_once($library . '.php');
            
            $_obj =& get_root();
            $lib_name = strtolower($library);
            if( (NULL !== $params) )
            {
                 $_obj->$lib_name = new $library( $params );
            }
            else
            {
                 $_obj->$lib_name = new $library();
            }
        }
    }
}

class CORE extends root{
    
    public function __construct()
    {    
        parent::__construct();
     
        $this->loaderclass =& load_class('LoaderClass'); 
        $this->loaderclass->library('test');
        echo $this->test->class_test() . '<br />';
    }
}

$core = new CORE();


Это сообщение отредактировал(а) icewind - 10.6.2009, 16:27


--------------------
user posted image
PM MAIL Skype   Вверх
solenko
Дата 10.6.2009, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Цитата(ksnk @  10.6.2009,  14:59 Найти цитируемый пост)
Затем, чтобы прозрачно для остального кода делать переопределение "модулей"? Правда для этого ее (функцию) по уму нужно превратить почти в настояший класс . Если считать что CORE будет единственным классом, то получается через задницу, по идее нужно пихать функционал load_class в сам CORE и не выпендриваться, но если представить, что этих CORE может быть много разных, то вполне нормальное решение. 


Что значит переопределение модулей? Приведите пример, а то примеры, которые могу придумать я явно удобнее реализовывать по-другому.



Цитата(ksnk @  10.6.2009,  14:59 Найти цитируемый пост)
Чем функция в PHP хуже какого-то там синглтона?

Сама п себу функция -- ничем не хуже. Хуже когда структура объекта не видна в исходном коде (вот как должен человек, разглядываюший такой класс догадатся что у него откуда-то появится абсолютно левое поле core?). 
Если уж вопрос стоял не "как сделать чтобы работало", то в идеале свойства объекта должны изменятся только через методы (хотя с этим иногда до абсурда доходит). Поведение объекта тоже должно быть скрыто от внешнего мира и тем, единственный будет создаватся объект или множество должен заведовать именно этот класс, а не непонятный core. 

Ну и вопрос связности тоже как бы задан мной но проигнорирован.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Sentox
Дата 10.6.2009, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



MoLeX
Код

<?
class CORE{
    
    public function __construct()
    {    
        $this->load =& load_class('load'); 
        $this->load->library('test');
        echo test::class_test().'<br />';
    }
}
$core = new CORE();
?>


test.php
Код

<?php
class test{
    
    public static function class_test()
    {
        return '<br />class test<br />';
    }
}
?>


Метод должен быть статичным для вызова  
Код

echo test::class_test().'<br />';


И однозначно это паттерн registry. Прислушайтесь к совету solenko.

PM MAIL   Вверх
ksnk
Дата 11.6.2009, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(solenko @  10.6.2009,  20:14 Найти цитируемый пост)
Что значит переопределение модулей? Приведите пример, а то примеры, которые могу придумать я явно удобнее реализовывать по-другому.

Приложение, application,  которое добиваем до нужного функционала всякими модулями и плагинами. 

Плагин "новости", умеет выводить себя в виде "сокращенного списка" на главной, в виде страничного списка в списке новостей и еще в разных видах.

Плагины инсталлируются в приложение, к примеру, функцией application::newPlugin($plugin). Хочется инсталлировать плагины не сразу, а только при первом непосредственном их использовании. Это значит, что код инсталляции упрятан в глубину кода, в место, непосредственно использующее функционал новостей, в функцию "вывода правого столбика главной", и т.д. 

Возникает пучек проблем. Если писать просто чего-то вроде $application->newPlugin(new news()), то возникнет та самая проблема переопределения плагина news, в случае, если мне приспичит состряпать его наследника с именем my_News. 

Итого, код инсталляции плагина должен выглядеть как-то так $application->newPlugin(load_class('news')), а вот уже этот самый load_class и будет изображать из себя фабрику, выдающую нужный нам плагин новостей. Он може быть и синглтон-объектом, если есть желание, но imho, функцией в PHP он получается немного поэффективней, да и букв поменьше писать...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
MoLeX
Дата 11.6.2009, 06:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Цитата(solenko @  10.6.2009,  14:30 Найти цитируемый пост)
symfony, zend, prado я что-то такого не встречал

я тоже, так как с ними не работал  smile 
Цитата(solenko @  10.6.2009,  14:30 Найти цитируемый пост)
если память не изменяет, писался под php4 => там множество атавизмов.

 smile 

и имено от туда я подцепил идею. ведь данная запись куда удобнее (для меня)
Код

<?php
$this->load->library('email');

$this->email->from('[email protected]', 'Your Name');
$this->email->to('[email protected]');

$this->email->subject('Тест Email');
$this->email->message('Тестирование класса отправки сообщений');

$this->email->send();

echo $this->email->print_debugger();
?>


чем
Код

<?php
$email = new email();

$email->from('[email protected]', 'Your Name');
$email->to('[email protected]');

$email->subject('Тест Email');
$email->message('Тестирование класса отправки сообщений');

$email->send();

echo $email->print_debugger();
?>




icewind,   smile

Добавлено через 9 минут и 9 секунд
Цитата(ksnk @  10.6.2009,  15:59 Найти цитируемый пост)
Выделить всёкод PHP
Код

class CORE{
    
    public function __construct()
    {    
        $this->load =& load_class('load'); 
        $this->test =& load_class('test'); 
        echo $this->test->class_test().'<br />';
    }
}


Может так?


не очень красиво =)



--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0848 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.