OO PHP-пояснение Для braindead n00b

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

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

Ответ 1

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

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

Композиция превосходит наследование.

Ответ 2

Подумайте об этом. Любая вещь, вещь, которую ты хочешь делать. Скажем, завтрак.

(Весь код псевдокод, любое сходство с любым языком, живущим, мертвым или подвергнутым клиническому насилию в банковской отрасли, является абсолютно случайным и не имеет никакого отношения к тому, что ваше сообщение помечено как 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;
}

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

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();
}

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

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

Ответ 3

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

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

Ответ 4

Я рекомендую читать Code Complete. Несколько ссылок на PHP OO великолепны, но это доходит до хлеба и масла идеи.

Ответ 5

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

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

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

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

3) Нам нравится стандартизировать вещи: "Хорошо, позвольте треугольники, круги и квадраты всех SHAPES, и ожидайте, что у всех их будет AREA и CIRCUMFERENCE".

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

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

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

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

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

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

Другой указатель на изучение OO:

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