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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос про классы, вопросик... 
:(
    Опции темы
GZep
  Дата 1.4.2007, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



Всем привед!

Меня достаточно давно мучает такой вот вопрос:

Имеется базовый класс
Код

class base {

}

У этого класса имеется конструктор, который должен дополнить текущий класс новыми методами
Код

class base {
     function __construct($var) {
        if (!is_file($var))
            die("Error");
        require($var);
     }
}

вызываем класс
Код

$class = new base("file.php");

соответственно файл file.php
Код

function ok() {
echo "ok :)";
}

ну и должно получится что-то типо вот такого
Код

die($class->ok());


Я понимаю, что написАл неправильно, просто хотел наглядно показать, что именно я хочу сделать...

Как такое реализовать? smile

Добавлено через 37 секунд
З.Ы. совместимость с пхп 4 не нужна... только 5-я версия...


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
vasac
Дата 1.4.2007, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



3-й пых был чистым интерпертатором, там нечто подобное было возможно.

А зачем, если не секрет это нужно? ИМХО, это надругательство над самыми основами.

Есть перехватчики, типа, __call(), на их основе можно попробовать реализовать динамическое добавление методов. Но все-таки, зачем?
PM WWW   Вверх
GZep
Дата 1.4.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



vasac, ну это что-то типо абстрактного класса.

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

просто это глупо выглядит на моем примере, ибо классы пустые...


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
SamDark
Дата 2.4.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

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



GZep, 
Что-то вроде
Код

class base{
   private $dataBase;

   public function __construct(DataBase $dataBase){
       $this->dataBase = $dataBase;
   }

  function __call ( $name, $args ){
     $this->database->$name($args);
  }
}



--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Glip
Дата 2.4.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

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



можно посмотреть описание __autoload()


--------------------
user posted image
PM MAIL   Вверх
GZep
Дата 2.4.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



да неее...

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

файл 1.php
Код

function ok() {
    echo "ok >>1<<";
}

файл 2.php
Код

function ok() {
    echo "ok >>2<<";
}


файл index.php
Код

class base {
     function __construct($var) {
        if (!is_file($var))
            die("Error");
        require($var);
     }
}
$class = new base("2.php");
$class->ok();//выводит "ok >>2<<"
/******************/
unset($class);
/******************/
$class = new base("1.php");
$class->ok();//выводит "ok >>1<<"


необходимо именно разделение класса на части с последующим выборочным собиранием в единое целое.

есть идеи?


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
xolod
Дата 2.4.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 24.5.2005
Где: Когда: Что:

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



Например так, только функцию(и) function ok надо тоже обернуть в класс с названием, которое передали на фабрику (поведение можно изменить, как хочется):
Код

class TBase {
  public static function factory($unit) {
    if (include_once($unit.'.php')) {
      return new $unit;
    } else {
      throw new Exception ('Фабрика не нашла подразделения '.$unit);
    }
  }
}

$someunit = TBase::factory('subunit');


Только накой вам этот слон?

Это сообщение отредактировал(а) xolod - 2.4.2007, 18:23
PM MAIL   Вверх
GZep
Дата 2.4.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



xolod, по-моему идею уловил, щас буду пробовать.
Цитата(xolod @  2.4.2007,  18:18 Найти цитируемый пост)
Только накой вам этот слон? 

я это чуть выше писАл... (это что-то типа объекта, который сам себя дополняет нужными драйверами для различный действий. Особенность этого класса - наличие "псевдо мозгов" smile )


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
SamDark
Дата 3.4.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

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



GZep, 
Реализовать в принципе можно, но как ты собираешься разрешать ситуацию, когда а базовый класс (тот, который универсальный) пытаемся засунуть методы двух классов с одинаковыми именами(т.е. A:smile() и B:smile())?


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
GZep
Дата 14.4.2007, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



SamDark, этим принебрегаем, потому что я на 100% знаю - такого не будет.

Цитата(SamDark @  3.4.2007,  09:11 Найти цитируемый пост)
Реализовать в принципе можно

КАК???


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
Glip
Дата 14.4.2007, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

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



я так понимаю, что наличие того или иного метода определяется в зависимости от имени файла передаваемого параметром
Код

$class = new base("file.php");

то есть если 
Код

$class = new base("anotherFile.php");

то не факт что там будет метод ok() 

я согласен с vasac, 
Цитата
А зачем, если не секрет это нужно? ИМХО, это надругательство над самыми основами.


Цитата(GZep @ 2.4.2007,  17:34)
файл 1.php
Код

function ok() {
    echo "ok >>1<<";
}

файл 2.php
Код

function ok() {
    echo "ok >>2<<";
}


мне кажется типичный случай полиморфизма
Код

class animal {}

class dog extends animal 
{
    function who() {
        echo "big dog";
    }
}

class cat extends animal 
{
    function who() {
        echo "small cat";
    }
}

раскладываем классы по файлам, в данном случае animal.class.php, cat.class.php, dog.class.php
и примерно с такой реализацией автолад
Код

    function __autoload($classname)
    {
        require $classname . 'class.php';
    }

создание объектов быдет выглядеть
Код

$object = new cat();
$object->who(); //small cat

$object = new dog();
$object->who(); //big dog

результат практически тот же что и  вашем примере с двумя ok()

пока у меня сложилось впечатление о некотором недопонимании теории smile

Это сообщение отредактировал(а) Glip - 14.4.2007, 21:53


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


участник Винграда
***


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

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



Цитата(Glip @  14.4.2007,  21:49 Найти цитируемый пост)
создание объектов быдет выглядеть
Выделить всёкод PHP
Код

$object = new cat();
$object->who(); //small cat
$object = new dog();
$object->who(); //big dog


результат практически тот же что и  вашем примере с двумя ok()

В том то и дело, что это - распространенный вариант, а нужно чтобы было:
Код

$object = new animal("dog"/*"cat"*/);
$object->who(); //small dog

на счет того момента, когда в подгружаемом классе не будет того или иного метода - это не для моего случая (из-за уверенности, что такого не будет)...

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


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0667 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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