[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Наследование не создавая экземпляр заново
ruzab
Господа форумчане, подскажите как можно сделать наследование от одного класса нескольких, но так, чтобы у родительского класса не создавался экземпляр заново.

На ум приходит создать родительский класс статичным, а доступ к его свойствам осуществлять через self:: Но у меня загвоздка в том, что если так сделать надо много где менять $this на self. Чесслово - очень много где smile.gif

Можно ли это като обойдти?



Спустя 8 минут, 9 секунд (15.12.2011 - 20:41) bodja написал(а):
А зачем?
Если не секрет.

Спустя 6 минут, 58 секунд (15.12.2011 - 20:48) Winston написал(а):
Цитата (ruzab @ 15.12.2011 - 19:33)
Но у меня загвоздка в том, что если так сделать надо много где менять $this на self. Чесслово - очень много где

По моему если класс наследуется, и в нем идет вызов какого-то свойства или еще чего, не определенного в нем, то тогда он ищет это свойство в родительском классе.
Цитата (ruzab @ 15.12.2011 - 19:33)
На ум приходит создать родительский класс статичным, а доступ к его свойствам осуществлять через self::

Почитай про parent

Спустя 6 минут, 56 секунд (15.12.2011 - 20:55) ruzab написал(а):
Не секрет. smile.gif
Не знаю, правда, получится-ли у меня всё это понятно объяснить. Но попробую...

У меня собственно есть класс назовем его "первый". Он наследуется от родительского класса в котором кое-что инициализируется и куда еще кое-что заносится в процессе работы скрипта (причем кое-что из всего этого имеет модификаторы protected). Php cкрипты находятся внутри методов этого "первого" класса.

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

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

Т.е. если я тупо сделаю наследование, то экземпляр родителя будет создан заново и я потеряю всю информацию, которая в процессе работы программы в него заносилась...

Не знаю, понятно-ли получилось? smile.gif

Спустя 1 час, 16 минут, 33 секунды (15.12.2011 - 22:11) bodja написал(а):
А.. ясно,
если уже клас определен,еще проще,передавайте указатель на него куда хотите,
хотите в родительский или еще куда нибудь. Ну и пользуйтесь ним.

Спустя 1 час, 37 минут, 53 секунды (15.12.2011 - 23:49) Guest написал(а):
Не моглибы вы поподробнее объяснить... Что вы имеете в виду и как это применить smile.gif

Спустя 2 минуты, 49 секунд (15.12.2011 - 23:52) ruzab написал(а):
Последнее сообщение было моё smile.gif

Спустя 2 часа, 55 минут (16.12.2011 - 02:47) caballero написал(а):
Цитата
как можно сделать наследование от одного класса нескольких, но так, чтобы у родительского класса не создавался экземпляр заново.

Никакого экземпляра родительского не создается в принципе. Создается один екземпояр класса наследника.

Цитата
Php cкрипты находятся внутри методов этого "первого" класса.

А на каком языке сами классы написаны и каким образом внутри методов находятся PHP скрипты?

Цитата
причем поскольку некоторые данные protected надо этот второй класс унаследовать от родителя.

А каким образом причиной наследования являются данные protected (шо сие такое кстати)

Цитата
Не знаю, понятно-ли получилось?

Пока понятно что к вам в колхоз наконец привезли компьютер (Я ЛЮБЛЮ СЕБЯ!). Когда подоишь коров - почитай про ООП - рекомендую книгу Котерова например.


 ! 

М
Поставил предупреждение, за использование мата.
Семён

Спустя 7 часов, 19 минут, 16 секунд (16.12.2011 - 10:06) ruzab написал(а):
Цитата (caballero @ 15.12.2011 - 23:47)
Цитата
Не знаю, понятно-ли получилось?

Пока понятно что к вам в колхоз наконец привезли компьютер (Я ЛЮБЛЮ СЕБЯ!). Когда подоишь коров - почитай про ООП - рекомендую книгу Котерова например.

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

Спустя 1 час, 9 минут, 34 секунды (16.12.2011 - 11:16) m4a1fox написал(а):
ruzab
ИМХО конечно, но просмотрите например книжку Мэтта Зандстры - там про шаблоны говорится. Может она вам чем нибудь поможет.

Спустя 1 час, 50 минут, 5 секунд (16.12.2011 - 13:06) caballero написал(а):
Цитата
ИМХО конечно, но просмотрите например книжку Мэтта Зандстры - там про шаблоны говорится. Может она вам чем нибудь поможет.

Какой там Зандстра? Тут не в програмировании проблема. Человек не может для живых людей связать несколько слов чтобы его могли понять чего он хочет а пытается программировать для тупой железяки.


Спустя 8 минут, 33 секунды (16.12.2011 - 13:15) m4a1fox написал(а):
caballero
Цитата
Какой там Зандстра? Тут не в програмировании проблема. Человек не может для живых людей связать несколько слов чтобы его могли понять чего он хочет а пытается программировать для тупой железяки.

А! Это уже другое! Практиковать надо! Как я понял суть в том, что наследование имеет один маленький недостаток. А именно, нельзя сделать так class Three extends two, one smile.gif
что в итоге получается, нельзя в class three унаследовать метода как из class two так и из class one одновременно!

Спустя 2 минуты, 36 секунд (16.12.2011 - 13:17) Winston написал(а):
Цитата (m4a1fox @ 16.12.2011 - 12:15)
А именно, нельзя сделать так class Three extends two, one

Да, множественного наследования в PHP нету. Но если сделать цепочку наследования one -> two -> three. То из класса 3 можно обращаться к членам из второго и первого класса...

Спустя 1 минута, 29 секунд (16.12.2011 - 13:19) SlavaFr написал(а):
Цитата (caballero @ 16.12.2011 - 10:06)
Человек не может для живых людей связать несколько слов чтобы его могли понять

Если не понятно, то можно переспросить или проигнорировать тему.
Хамство вызывает в 95% процентах агресивную реакцию и приводит к отдалению от темы.

@caballero чего Вы хотели добится вашим хамским высказыванием?

Спустя 7 минут, 10 секунд (16.12.2011 - 13:26) bodja написал(а):
Ну чего сцепились?
Сделать можно ,если я правильно понял ТС.
Нужно получить доступ к методам из другого обьекта к уже созданому обьекту.
Правильно?

Спустя 2 минуты, 33 секунды (16.12.2011 - 13:28) m4a1fox написал(а):
Winston
Цитата
Но если сделать цепочку наследования one -> two -> three

Я поэтому про шаблоны и говорил. Копозиция, делегирование и т.д. слабо еще разбираюсь в этом...

Спустя 17 секунд (16.12.2011 - 13:29) caballero написал(а):
Цитата
А! Это уже другое! Практиковать надо! Как я понял суть в том, что наследование имеет один маленький недостаток. А именно, нельзя сделать так class Three extends two, one 
что в итоге получается, нельзя в class three унаследовать метода как из class two так и из class one одновременно!

В последнем PHP добавили treat для компенсации отсутствия множественного наследования.

Цитата
Если не понятно, то можно переспросить или проигнорировать тему.

Переспрашивали - получили такой же поток сознания.

Цитата
Хамство вызывает в 95% процентах агресивную реакцию и приводит к отдалению от темы.

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

Цитата
@caballero чего Вы хотели добится вашим хамским высказыванием?

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



Спустя 1 минута, 14 секунд (16.12.2011 - 13:30) caballero написал(а):
Цитата
Я поэтому про шаблоны и говорил. Копозиция, делегирование и т.д. слабо еще разбираюсь в этом...

Напрасно говорил - это просто наследование не более того. Просто кроме дочернего класса есть еще и внучатый.

Спустя 2 минуты, 54 секунды (16.12.2011 - 13:33) m4a1fox написал(а):
caballero
Чтобы ты взял карандаш бумагу нарисовал примеры в кубиках или как там

UML мать его!
Цитата
Напрасно говорил - это просто наследование не более того

Ну тогда я в книжку полез!

Спустя 43 секунды (16.12.2011 - 13:33) ruzab написал(а):
Цитата (bodja @ 16.12.2011 - 10:26)
Нужно получить доступ к методам из другого обьекта к уже созданому обьекту.
Правильно?

Да, всё именно так.

Спустя 4 минуты, 4 секунды (16.12.2011 - 13:38) caballero написал(а):
Цитата
UML мать его!

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

Спустя 18 секунд (16.12.2011 - 13:38) m4a1fox написал(а):
ruzab
Цитата
Нужно получить доступ к методам из другого обьекта к уже созданому обьекту.

Хм, ну грубо говоря:
Что мешает сделать так
$obj = new Two (new Three);

Спустя 1 минута, 33 секунды (16.12.2011 - 13:39) m4a1fox написал(а):
caballero
Цитата
какой тип стрелочки с каким наконечником чего означает

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

Спустя 3 минуты, 30 секунд (16.12.2011 - 13:43) caballero написал(а):
Цитата
Нужно получить доступ к методам из другого обьекта к уже созданому обьекту.


или на понятном языке (одна из версий):

Нужно получить доступ к методам уже созданного объекта из другого объекта

или проще :

Нужно получить доступ к методам объекта из другого объекта

(очевидно что если это объект то он уже создан)

Спустя 2 минуты, 27 секунд (16.12.2011 - 13:45) m4a1fox написал(а):
Эээээээ
$obj = new One();

$obj2 = new Two($obj);

Передать в качестве параметра.

Спустя 23 минуты, 56 секунд (16.12.2011 - 14:09) ruzab написал(а):
Господа, я попробую объяснить на примере:


class A {

private $a;
protected $b;
public $c;

protected function setA ($a) {

$this->a = $a;
}

protected function getA () {

return $this->a;
}

}


class B extends A {

public function __construct () {

$this->setA(10);
$this->b = 20;
$this->c = 30;
}

}


$m = new B;


Так вот теперь мне надо сделать:


class C extends A{

public function __construct () {

echo $this->getA();
echo $this->b;
echo $this->c;
}
}


$n = new B;



Но если я так сделаю, то надо заново присваивать значения переменным $a $b $c. А мне нужны значения этих переменных, которые ранее уже были оперделены в классе B!

Спустя 4 минуты, 7 секунд (16.12.2011 - 14:13) bodja написал(а):
Цитата (ruzab @ 16.12.2011 - 10:33)
Цитата (bodja @ 16.12.2011 - 10:26)
Нужно получить доступ к методам из другого обьекта к уже созданому обьекту.
Правильно?

Да, всё именно так.

Значит так
делаем такой класс

class Class1  {
public $pro='куку<br>';
public function metod1() {
return $this->pro;
}
}


потом такой

class Class2  {
public $obj;
public function metod2() {
return $this->obj->metod1();
}
}


потом создаем обьект первого класса,ну и меняем pro ,чтобы убедится потом ,что мы получили доступ к первому обьекту из другого класса

$obj1=new Class1();
$obj1->pro='прювет! я значение pro1 класса Class1<br>';


Теперь ключевой момент :)

$obj2=new Class2();
$obj2->obj=$obj1;
echo $obj2->metod2();


результат

Цитата
прювет! я значение pro1 класса Class1


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

Спустя 8 минут, 58 секунд (16.12.2011 - 14:22) m4a1fox написал(а):
bodja
Как мне кажется с 2 классами проблемы не особо возникнут! Можно даже переписать метод + наследование! А вот с 3 - уже похуже будет!

Спустя 1 минута, 28 секунд (16.12.2011 - 14:24) caballero написал(а):
Разговор слепого с глухим. Теперь понятнее в чем вопрос но народ продолжает писать что знает а не что спрашивают

Цитата
А мне нужны значения этих переменных, которые ранее уже были оперделены в классе B!


В такой постановке только статические переменные объявленные в родительском классе A

static protected $a;


Хотя речь шла о доступе к методам. Или это разные вопросы. Фиг поймешь до конца.

Спустя 10 минут, 4 секунды (16.12.2011 - 14:34) m4a1fox написал(а):
Как вариант! Покрасивше!!!

<?php
class
A {
private $a;
protected $b;
public $c;

protected function setA ($a) {
$this->a = $a-10;
}

protected function getA () {
return $this->a;
}
}


class B extends A {
public function __construct () {
$this->setA(340);
$this->b = 20;
$this->c = 130;
}
}


class C{
private $strategy;

public function __construct (B $str) {
$this->strategy = $str;
}
}


$t = new C(new B);
echo '<pre>';
print_r($t);
echo '</pre>';
?>

Спустя 6 минут, 50 секунд (16.12.2011 - 14:41) Семён написал(а):
Тип говнокодить пытается, а вы ему показываете конкретные примеры как это сделать)
Если бы не хамство caballero, всем бы уже давно стало понятно)

Спустя 5 минут, 5 секунд (16.12.2011 - 14:46) ruzab написал(а):
Цитата (Семён @ 16.12.2011 - 11:41)
Тип говнокодить пытается, а вы ему показываете конкретные примеры как это сделать)


Прошу объяснить - в чем тут говнокод.

Спустя 5 минут, 52 секунды (16.12.2011 - 14:52) bodja написал(а):
Цитата
Как мне кажется с 2 классами проблемы не особо возникнут! Можно даже переписать метод + наследование! А вот с 3 - уже похуже будет!


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

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

Спустя 7 минут, 55 секунд (16.12.2011 - 15:00) ruzab написал(а):
Всем спасибо! Я для себя много чего понял, аглавное что архитектуру по видимому и вправду надо будет скоро изменять...

Спустя 6 минут, 51 секунда (16.12.2011 - 15:06) m4a1fox написал(а):
ruzab
Значит это не то что вы хотели?

<?php
class
A {
private $a;
protected $b;
public $c;

protected function setA ($a) {
$this->a = $a-10;
}

protected function getA () {
return $this->a;
}
}


class B extends A {
public function __construct () {
$this->setA(340);
$this->b = 20;
$this->c = 130;
}
}


class C{
private $strategy;

public function __construct (B $str) {
$this->strategy = $str;
}
}


$t = new C(new B);
echo '<pre>';
print_r($t);
echo '</pre>';
?>

Спустя 49 минут, 35 секунд (16.12.2011 - 15:56) caballero написал(а):
Цитата
Тип говнокодить пытается, а вы ему показываете конкретные примеры как это сделать)


Говнокод - не страшно - дело опыта. А если показать решение то будет меньше кода а значит и говнокода. Профит!

Тут проблема понять чего показать.

Цитата
Значит это не то что вы хотели?


чего он хотел. я написал. Надеюсь угадал

Цитата
private $strategy;

Strategy - это наше все. Чуствуется крепкая рука Мета Зандстры biggrin.gif



Спустя 1 час, 4 минуты, 48 секунд (16.12.2011 - 17:01) m4a1fox написал(а):
caballero
Цитата
Чуствуется крепкая рука Мета Зандстры

Ну а куда девать! Уже почти рефлекс! Не знаю к добру ли... надеюсь что не зря каждый шаблон разбираю по кусочкам!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.