|
|
|
| Вот часто захожу на этот форум. Хороший форум. Часто вижу сабжи про ООП. Сейчас я немного прогружу всех тем, что такое классы и объекты.
1. Класс - это Абстрактный Тип Данных. АТД. В РНР нет типизации, но в других языках есть.
Давайте для начала смоделируем что-нибудь простое, например, класс ввода данных куда-либо, например, в базу, но об этом позже.
Пишем класс:
<?
class SomeClass
{
private $name;
private $theme;
private $msg;
public function __construct($name, $theme, $msg)
{
$this->name = $name;
$this->theme = $theme;
$this->msg = $msg;
}
}?>
|
Этим классом я показал, как смоделировать класс. Мы просто взяли то, что нам надо и перенесли в класс. Смоделировали сущность того, что нам необходимо.
из этого видно, что класс SomeClass является контейнером некоторых данных, т.е. является совершенно новым типом данных. Почему поля приватные, объясню позже. Теперь надо сделать что-нибудь с данными, из которых состоит новый тип данных SomeClass. Например, данные хранятся в базе. Класс работы с бд писать не буду. Просто он работает с базой.
Добавляем в класс новый тип данных - DataBase. класс примет такой вид:
<?
class SomeClass
{
private $name;
private $password;
private $theme;
private $msg;
private $db;
public function __construct($name, $password, $theme, $msg, $db)
{
$this->name = $name;
$this->password = $password;
$this->theme = $theme;
$this->msg = $msg;
$this->db = $db;
}
}
?>
|
Собственно, появилось еще одно поле. Теперь мы можем передать тип данных для работы с базой в наш тип. Т.е. наш тип включает в себя тип данных для работы с базой. Это один из способов наследования, но об этом позже.
А как получить тип данных для работы с базой? Так:
$db = new DBMySQL($host, $user, $password, $dbName);
|
$db - тип данных для работы с базой.
Теперь сделаем наш класс более функциональным - добавим некоторый метод.
<?
public function selectAll()
{
$sql = "SELECT name, theme, msg FROM my_table";
$myDatas = array();
$array = $this->db->dbSelect($sql);
foreach($array as $ar)
{
$myDatas[] = new SomeClass($ar->name, $ar->theme, $ar->msg);
}
return $myDatas;
}
?>
|
Этот метод выбирает все записи из таблицы и возвращает массив объектов нашего типа. может, с точки зрения это не очень оптимально, но ссейчас не об этом.
Данные в классе объявлены как частные, т.е. только методы нашего класса могут с ними работать. Чтобы где-то обратиться к этим полям, надо как-то получить к ним доступ. Делаем это так:
public function getName()
{
return $this->name;
}
|
Принцип, надеюсь, ясен. Паблик означает, что к методу или полю можно обращаться отовсюду.
Теперь подумаем над тем, как инициализировать данные в классе. Есть несколько способов, но остановимся над одном. В нашем случае это делает конструктор класса. Помните метод с именем __construct. Этот метод всегда выполняется непосредственно перед созданием объекта, т.е. выделением памяти под объект. Если конструктор объявлен с к.л. параметрами, то объект создаем так:
$myObj = new SomeClass($name, $theme, $msg);
|
Мы получили объект. Дальше можно приступать к работе с ним. Про наследование, полиморфизм и другое расскажу в следующем посте. | |
|
|
|
|
|
|
|
для: t4f
(27.02.2007 в 16:21)
| | Еще пару слов про проектирование.
при проектировании надо учитывать то, из чего действительно должен состоять класс. Например, пачка сигарет состоит из упаковки и массива сигарет. Сайт может состоять из главной странице, страници новостей, статей, гостевой, форума и т.д. Таким образом надо четко определиться с тем, из чего должен состоять класс.
Класс должен работать только со своими данными. Ничего лишнего недолжно быть. Например, в классе пачке сигарет ненадо моделировать метод открытия бутылки с газировкой. | |
|
|
|
|
|
|
|
для: t4f
(27.02.2007 в 16:21)
| | Теперь нам надо расширить функциональность. Например, надо сделать более функциональную форму, но уже на другой странице. Например, мы захотели знать email и icq посетителя. Давайте расширим наш класс наследованием
<?
class CoolClass extends SomeClass
{
private $email;
private $icq;
public function __construct($name, $theme, $msg, $db, $email, $icq)
{
parent :: __construct($name, $theme, $msg, $db);
$this->email = $email;
$this->icq = $icq;
}
public function selectAll()
{
$sql = "SELECT name, theme, msg, email, icq FROM my_second_table";
$myDatas = array();
$array = $this->db->dbSelect($sql);
foreach($array as $ar)
{
$myDatas[] = new CoolClass($ar->name, $ar->theme, $ar->msg, $ar->email, $ar->icq);
}
return $myDatas;
}
}
?>
|
Мы наследовали CoolClass от SomeClass. Обратите внимание на новый конструктор, особенно на строку
<?
parent :: __construct($name, $theme, $msg, $db);
?>
|
Подобным способом мы заставили предок нашего класса проинициализировать свои свойства, которые мы унаследовали. Мы надеямся, что теперь данные предка видны в потомке. Нет. Они не видны. потому что они приватные. Надо в классе предке изменить модификатор доступа к ним на protected. если это сделать, то мы сможем обращаться к ним из нашего нового класса. Вы видели наследование. Но и до этого вы смогли наблюдать наследование в виде включения. где именно - попробуйте найти сами. | |
|
|
|
|
|
|
|
для: t4f
(27.02.2007 в 16:21)
| | Про полиморфизм, абстрактные классы, интерфейсы и прочее расскажу в следующий раз. | |
|
|
|
|
|
|
|
для: t4f
(27.02.2007 в 16:59)
| | Возникает только один вопрос:
А насколько вообще актуальны классы в php?
Насколько я понимаю они кушают доп ресурсы серва?
П.С. Не спорю классы рулез, в них гораздо удобней писать, но актуальность имхо под вопросом (без наследования).
Кстати ток что на тему напоролся =)
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=32921&page=6 | |
|
|
|
|
|
|
|
для: Whi-teOoS
(27.02.2007 в 17:04)
| | Я работаю в интрасети, сайты для интернет не делал. Число пользователей систем не привышало 1000 человек. Поэтому производительность не тестировал. У нас мощные сервера. но намного ли они кушают ресурсы? не проверял. Думаю не намного. Например, намного ли многомерный массив переменных отличается от одномерного массива методов? Кто тестировал, цифры в студию!
Может, производительность и падает, не проверял.
Насколько классы октуальны? Например, четыре программиста пишут сайт. Один написал класс для работы с базой. Написал документацию. Уволился. На его место пришел новый. И ему дали задание расширить этот класс. Чтобы функциональность общей системы не пострадала, он наследует свой класс от предыдущего и добавляет новые методы. В общем коде меняется только тип на новый.
Без наследования? А намного ли актуален скрипт, где вперемешку с рнр идет джаваскрипт, хтмл? ООП мне помагает отделить логику от представления. Правда это можно сделать и без классов, это дело вкуса.
Лично мне более понятен код, написанный классами. | |
|
|
|
|
|
|
|
для: t4f
(27.02.2007 в 17:19)
| | Ну не наю, может ты и прав xD
Я ваще сам в последнее время в объектах пишу, ток чет в голову как обычно куча тупых вопросов полезла, вот и спросил ;) | |
|
|
|
|
|
|
|
для: Whi-teOoS
(28.02.2007 в 16:52)
| | Ну не знать и спросить - стыд одной минуты, а не знать и не спросить - стыд всей жизни. :) | |
|
|
|
|
|
|
|
для: t4f
(27.02.2007 в 16:21)
| | Лучше оформите в виде статьи, выложили бы в раздел статей, чтобы потом не искать по всему форуму. | |
|
|
|
|
|
|
|
для: cheops
(28.02.2007 в 01:15)
| | В виде статьи? Надо все как следует подготовить. В выходные займусь. Или на работе. Если начальник разрешит :) Да и более академическим языком попытаюсь написать. | |
|
|
|
|
|
|
|
для: t4f
(28.02.2007 в 10:01)
| | Да, в виде статьи было бы здорово.
Потом только как-нибудь сообщите, что статья на сайте и ссылку дайте.. | |
|
|
|
|
|
|
|
для: t4f
(28.02.2007 в 10:01)
| | А может,все-таки не стоит более академическим языком ? :-) Мануалов,написанных так,что понять их может только автор,и так в сети полно... | |
|
|
|
|
|
|
|
для: Ralph
(28.02.2007 в 20:10)
| | Да, я тоже так подумал. Если бы я начал писать так как в книгах, то я бы просто их переписал бы. Но получилось так, как получилось. Если статья пройдет цензуру и будет адекватна, то ее выложат на сайте. | |
|
|
|
|
|
|
|
для: t4f
(28.02.2007 в 22:50)
| | Статью написал. Выслал Хеопсу. Надеюсь, что статья многим поможет. | |
|
|
|
|
|
|
|
для: t4f
(01.03.2007 в 13:53)
| | Статью получил, отредактирую и выложу в ближайшее время. | |
|
|
|
|
|
|
|
для: cheops
(01.03.2007 в 14:09)
| | Наверное, пример про пачку сигарет надо изменить, а то, наверное, некорректно будет по отношению к некурящим. На пчку жвачки можно заменить, наверное. | |
|
|
|
|