OO PHP объяснение для мозговой смерти n00b - PullRequest
12 голосов
/ 17 сентября 2008

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

Кто-нибудь может объяснить в терминах, что любой идиот может понять, ОО и как это работает в PHP, или указать мне учебник по идиотам?

Ответы [ 7 ]

33 голосов
/ 17 сентября 2008

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

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

Итак, вы определяете шаблон для представления завтрака. Это класс:

class Breakfast {

}

Завтраки содержат атрибуты. В обычных не объектно-ориентированных вещах вы можете использовать массив для этого:

$breakfast = array(
'toast_slices' => 2,
'eggs' => 2,
'egg_type' => 'fried',
'beans' => 'Hell yeah',
'bacon_rashers' => 3 
);

И у вас будут различные функции для игры с ним:

function does_user_want_beans($breakfast){
     if (isset($breakfast['beans']) && $breakfast['beans'] != 'Hell no'){
         return true;
     }
     return false;
}

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

class Breakfast {
  var $toast_slices = 2;
  var $eggs = 2;
  var $egg_type = 'fried';
  var $beans = 'Hell yeah';
  var $bacon_rashers = 3;

  function wants_beans(){

     if (isset($this->beans) && $this->beans != 'Hell no'){
         return true;
     }

     return true;

  }

  function moar_magic_pig($amount = 1){

     $this->bacon += $amount;

  }

  function cook(){
      breakfast_cook($this);
  }

}

И тогда манипулирование идеей программы «Завтрак» становится намного чище:

$users = fetch_list_of_users();

foreach ($users as $user){
    // So this creates an instance of the Breakfast template we defined above

    $breakfast = new Breakfast(); 

    if ($user->likesBacon){
       $breakfast->moar_magic_pig(4);
    }

    // If you find a PECL module that does this, Email me.
    $breakfast->cook();
}

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

Есть лучшие объяснения того, что такое ОО на самом деле, и почему оно академически лучше, но это моя практическая причина, и оно содержит бекон.

7 голосов
/ 17 сентября 2008

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

Обязательно взгляните на философию " Скажи, не спрашивай ", и принцип "Необходимости знать" (он же "Закон Деметры") также очень важен.

6 голосов
/ 18 сентября 2008

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

Т.е. человечество разработало колесо тысячи лет назад. Мы можем дорабатывать его все время, но нам, конечно, не нужно заново его изобретать ...

1) Нам нравится классифицировать вещи: «этот больше, чем этот», «этот стоит больше, чем этот», «этот почти такой же, как тот ".

2) Нам нравится упростить вещи: «Хорошо, это трактор с жидкостным охлаждением V8 с турбонаддувом, но я все равно просто поворачиваю руль и нажимаю ноги на педали водить его, верно? ".

3) Нам нравится стандартизировать вещи: «Хорошо, давайте назовем треугольники, круги и квадраты всеми ФОРМАМИ, и ожидаем, что у них всех будет ОБЛАСТЬ и ОБОЛОЧКА».

4) Нам нравится адаптировать вещи: "Хммм, мне это нравится, но можно ли вместо этого использовать его в Racing Green?".

5) Нам нравится создавать чертежи : "У меня еще нет времени или денег (или одобрения), чтобы построить это, но у него будут дверь и крыша, а некоторые окна и стены ".

6) Нам нравится защищать вещей: "Хорошо, я позволю вам увидеть общую цену, но я скрываю добавленную мной наценку! ».

7) Нам нравится, когда общаются друг с другом: "Я хочу получить доступ к своему банковскому балансу через: мой мобильный телефон; мой компьютер; банкомат; банковский служащий; и т. Д." .. ".

Чтобы узнать, как использовать ОО (и увидеть некоторые из преимуществ), тогда я предлагаю вам сделать домашнее задание - может быть, приложение на основе браузера, которое имеет дело с ФОРМАМИ, такими как круги, прямоугольники и треугольники, и отслеживает их площадь, цвет, положение, z-индекс и т. д. Затем добавьте квадраты в качестве особого случая прямоугольника, поскольку он одинаков в отношении большей части его определения, площади и т. д. Просто имеет добавленное условие, когда высота одинакова как ширина. Чтобы сделать это сложнее, вы можете сделать прямоугольник типом четырехугольника, который является типом многоугольника. и т. д.

ПРИМЕЧАНИЕ: Я бы не стал использовать PHP Framework, пока вы не освоитесь с основами OO-программирования. Они гораздо мощнее, когда вы можете расширять свои собственные классы, а если нет, то это немного похоже на изучение чего-либо наизусть -> намного сложнее!

0 голосов
/ 18 сентября 2008

Я был на твоем месте, но я увидел свет после того, как прочитал эту книгу (несколько раз!) http://www.apress.com/book/view/9781590599099 После того, как я прочитал это, я действительно "получил" это и не оглянулся , Вы получите его на Amazon.

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

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

0 голосов
/ 18 сентября 2008

Еще один указатель для обучения ОО:

Большинство обучающих программ по ОО будут сосредоточены на наследовании (например, класс X расширяет класс Y). Я думаю, что это плохая идея. Наследование полезно, но оно также может вызвать проблемы. Что еще более важно, наследование не является целью ОО. Дело в абстракции; скрывая детали реализации, чтобы вы могли работать с простым интерфейсом. Научитесь писать хорошие абстракции своих данных, и вы будете в хорошей форме. Не парься по наследству сразу.

0 голосов
/ 18 сентября 2008

Вместо того, чтобы изучать ОО с нуля, я думаю, было бы проще, если бы вы взялись за среду, которая облегчает объектно-ориентированное программирование. Это «заставит» вас использовать правильные методы ООП; из того, как написана структура, вы сможете узнать, как лучше всего выполнять ООП.

Я бы порекомендовал каркас QCodo PHP5 http://www.qcodo.com. Там есть отличные видеоуроки о том, как его настроить, а также видео-тренинги (http://www.qcodo.com/demos/).

Полное раскрытие: я разрабатывал поверх этой платформы два года, и я добавил код для их кодовой базы (поэтому я не совсем беспристрастен :-)).

0 голосов
/ 17 сентября 2008

Лучший совет был от: xtofl.myopenid.com ^^^^

Если вы не понимаете целей шаблонов, вы действительно не собираетесь использовать объекты в их полном объеме. Вам необходимо знать, почему наследование, полиморфизм, интерфейсы, фабрики, декораторы и т. Д. Действительно облегчают проектирование, решая конкретные проблемы.

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