Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Классы и объекты.
 
 автор: t4f   (27.02.2007 в 16:21)   письмо автору
 
 

Вот часто захожу на этот форум. Хороший форум. Часто вижу сабжи про ООП. Сейчас я немного прогружу всех тем, что такое классы и объекты.
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:31)   письмо автору
 
   для: t4f   (27.02.2007 в 16:21)
 

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

   
 
 автор: t4f   (27.02.2007 в 16:48)   письмо автору
 
   для: 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:59)   письмо автору
 
   для: t4f   (27.02.2007 в 16:21)
 

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

   
 
 автор: Whi-teOoS   (27.02.2007 в 17:04)   письмо автору
 
   для: t4f   (27.02.2007 в 16:59)
 

Возникает только один вопрос:
А насколько вообще актуальны классы в php?
Насколько я понимаю они кушают доп ресурсы серва?
П.С. Не спорю классы рулез, в них гораздо удобней писать, но актуальность имхо под вопросом (без наследования).

Кстати ток что на тему напоролся =)
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=32921&page=6

   
 
 автор: t4f   (27.02.2007 в 17:19)   письмо автору
 
   для: Whi-teOoS   (27.02.2007 в 17:04)
 

Я работаю в интрасети, сайты для интернет не делал. Число пользователей систем не привышало 1000 человек. Поэтому производительность не тестировал. У нас мощные сервера. но намного ли они кушают ресурсы? не проверял. Думаю не намного. Например, намного ли многомерный массив переменных отличается от одномерного массива методов? Кто тестировал, цифры в студию!
Может, производительность и падает, не проверял.

Насколько классы октуальны? Например, четыре программиста пишут сайт. Один написал класс для работы с базой. Написал документацию. Уволился. На его место пришел новый. И ему дали задание расширить этот класс. Чтобы функциональность общей системы не пострадала, он наследует свой класс от предыдущего и добавляет новые методы. В общем коде меняется только тип на новый.
Без наследования? А намного ли актуален скрипт, где вперемешку с рнр идет джаваскрипт, хтмл? ООП мне помагает отделить логику от представления. Правда это можно сделать и без классов, это дело вкуса.
Лично мне более понятен код, написанный классами.

   
 
 автор: Whi-teOoS   (28.02.2007 в 16:52)   письмо автору
 
   для: t4f   (27.02.2007 в 17:19)
 

Ну не наю, может ты и прав xD
Я ваще сам в последнее время в объектах пишу, ток чет в голову как обычно куча тупых вопросов полезла, вот и спросил ;)

   
 
 автор: t4f   (28.02.2007 в 17:56)   письмо автору
 
   для: Whi-teOoS   (28.02.2007 в 16:52)
 

Ну не знать и спросить - стыд одной минуты, а не знать и не спросить - стыд всей жизни. :)

   
 
 автор: cheops   (28.02.2007 в 01:15)   письмо автору
 
   для: t4f   (27.02.2007 в 16:21)
 

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

   
 
 автор: t4f   (28.02.2007 в 10:01)   письмо автору
 
   для: cheops   (28.02.2007 в 01:15)
 

В виде статьи? Надо все как следует подготовить. В выходные займусь. Или на работе. Если начальник разрешит :) Да и более академическим языком попытаюсь написать.

   
 
 автор: tAleks   (28.02.2007 в 11:30)   письмо автору
 
   для: t4f   (28.02.2007 в 10:01)
 

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

   
 
 автор: Ralph   (28.02.2007 в 20:10)   письмо автору
 
   для: t4f   (28.02.2007 в 10:01)
 

А может,все-таки не стоит более академическим языком ? :-) Мануалов,написанных так,что понять их может только автор,и так в сети полно...

   
 
 автор: t4f   (28.02.2007 в 22:50)   письмо автору
 
   для: Ralph   (28.02.2007 в 20:10)
 

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

   
 
 автор: t4f   (01.03.2007 в 13:53)   письмо автору
 
   для: t4f   (28.02.2007 в 22:50)
 

Статью написал. Выслал Хеопсу. Надеюсь, что статья многим поможет.

   
 
 автор: cheops   (01.03.2007 в 14:09)   письмо автору
 
   для: t4f   (01.03.2007 в 13:53)
 

Статью получил, отредактирую и выложу в ближайшее время.

   
 
 автор: t4f   (01.03.2007 в 14:19)   письмо автору
 
   для: cheops   (01.03.2007 в 14:09)
 

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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования