2010-06-26 5 views
3

Я официально умственно отсталый. [Позвольте мне объяснить]Понимание классов в PHP

Я никогда не давал занятиям и их отношениям какую-либо мысль до сегодняшнего дня. Я пытаюсь понять что-то, что кажется довольно очевидным, но поскольку я глуп, я не вижу его.

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

class cOne { 
    public function functionOne(){ 
     echo "something"; 
    } 
} 

Затем на другой файл, я говорю:

class cOneChildOne extends cOne { 
    public function functionOne(){ 
     echo "something from child one"; 
    } 
} 

И еще на другом файле я говорю:

class cOneChildTwo extends cOne { 
    public function functionOne(){ 
     echo "something from child two"; 
    } 
} 

Как Я должен создать новый объект, и когда, так что я могу получить доступ к функциям как от дочерних, так и от родительского класса в моде, подобном $newObject->Children->function();. Я серьезно рассматриваю вариант, который у меня есть полностью потерял мой мозг сегодня и не может думать прямо.

Я, очевидно, делаю что-то неправильно, так как: $newObject = new cOne; создает объект, но тогда код из одного из подклассов не может получить доступ к чему-либо, что непосредственно не относится к основному классу или самому.

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

Помогите мне или стреляйте в меня! Спасибо

+0

hmmm ... что меня больше интересует в данный момент, это вопрос - должен ли я помочь вам и, возможно, это повысит вашу уверенность или просто позволит вам сгнить лицом вниз в вашей собственной луже с низким самооценкой? .. (я не знаю, php, если бы я это сделал, правда, я бы попытался помочь :) – gillyb

+0

hahahaha Я, очевидно, полностью драматизировал все это, это не то, что я собираюсь выпрыгнуть из окна;) Спасибо для вашего «было бы» полезным ответом gillyb – johnnyArt

+0

Тот факт, что вам нужно сделать это таким образом, похоже, отходит от объектно-ориентированного подхода и больше в линейный, загроможденный подход. –

ответ

0

вы можете использовать parent::functionOne(); для вызова функций родительского класса из дочернего класса. вы не можете вызывать функции дочерних классов из родительского класса.

+0

Я пытаюсь вызвать функции sibling, а не из родителя, но из childs – johnnyArt

1

Родительский класс cOne не знает классов, которые расширяют его в php, поэтому, когда вы можете вызвать родителя из дочернего класса с помощью parent::someFunction(), вы не можете вызывать дочерние классы из родителя. Вы также не могли вызывать функции из других классов, которые расширяют cOne от класса, который расширяет cOne, также потому, что cOne не знает классов, которые его расширяют.

0

Помогите мне или стреляйте в меня !!

Bang !!! = o) = o) = o)

Когда вы создаете экземпляр класса, он знает только его s methods and method s от его родителей. Вы не можете сказать, что есть другие классы, которые распространяют один и тот же родитель.

0

Поскольку kgb говорит, вы не можете создать один объект, который даст вам «доступ» к поведению обоих классов. Если вы создаете экземпляр cOneChildOne, вы получите что-то, что выводит «что-то из дочернего» (*). Вы могли бы, если используете parent::functionOne(), скопируйте поведение cOne, возможно, вернете «что-то \ nsomething от дочернего» или что-то еще.

(*) Не делайте этого.Скорее всего, возвращает строку:

public function functionOne(){ 
    return "something from child one"; 
} 

Это позволяет создавать свои функции, вывод их в файлы и т.д.

+0

Итак, я мог бы создать объект, который содержит другие ранее созданные объекты и работать с этим объектом, а не с другими. Они расширяют основной объект, с которым я не работаю, и могу получить доступ к функции от своего родителя, но с помощью этого контейнера объектов я мог бы назвать их всех. Overkill? Подходы? – johnnyArt

0

Вы всегда можете просто позвонить cOneChildTwo внутри cOneChildOne статически, если это достаточно ваше требование. $this в методе всегда указывает на объект вызываемого абонента (так работает parent :: __ construct()), поэтому вы можете использовать состояние вызываемого абонента внутри cOneChildTwo для расширенного поведения.

Однако это может означать, что вам потребуются методы обёртки для каждого метода брата. Это ничто не отразится на Рефлементе.

0

У вас есть фундаментальное недоразумение.

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

Если вы хотите, чтобы child1 мог вызвать методы child2, в вашем дизайне что-то не так. Одним из решений было бы перемещение метода из child2 в родительский класс, так что child1 также наследовал бы этот метод.

+0

Другим способом было бы передать экземпляр второго дочернего элемента в конструктор первого ребенка, но, как сказано ранее, в этом нет никакого смысла. – Eugene

+0

Правильно, если оба метода child1 и child2 нуждаются в вызове метода A, тогда метод A принадлежит родительскому. – timdev

0

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

child1.communicateWithAnotherChild(someOtherChild) 
2

Вы можете собрать ребенка экземпляры в классе мастеров статического массива

class C1{ 
    static public $childs=array(); 
    function __construct(){ 
    self::$childs[]=$this;  
    } 
} 
class C1C1 extends C1{ 
    function hi(){ 
    echo 'hi from C1C1 <br />'; 
    } 
} 
class C1C2 extends C1{ 
    function hi(){ 
    echo 'hi from C1C2 <br />'; 
    }  
} 

$c1 = new C1C2(); 
$c2 = new C1C2(); 
$c3 = new C1C1(); 
$c4 = new C1C1(); 
$c5 = new C1C1(); 
$c6 = new C1C1(); 
foreach(C1::$childs as $c){ 
    $c->hi(); 
} 
0

Почему вы не можете иметь static Array $children в cOne классе, и __construct() методы классов, которые расширяют его просто называют cOne::addChild($this) ? Каждый из них может реализовать функцию getChildren, которая отправляет запрос на суперкласс. Не должно ли это работать?

Смежные вопросы