Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП в PHP5. Практика. Практическое использование нововведений 
:(
    Опции темы
Render
Дата 13.8.2005, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 12.5.2005

Репутация: нет
Всего: 3



Вообщем сижу и практикуюсь с пятерочой, порадовали многие нововведения в ООП языка. Единственное вызывают вопрос некоторые фишки:
новые уровни доступа private, public, protected - зачем запрещать доступ к переменным родителя в классах наследниках. Практическое применение??? smile
абстрактные классы и методы (abstract) - зачем создавать класс (нельзя создать экземпляр класса), методы которого нельзя вызывать соответственно??? smile
интерфейсы (interface) - вот это действительно классная вещь!
статические методы класса - радует!!!
система перехвата исключений (exceptions) - The best =)
финальные классы и методы - финальный метод невозможно переопределить в классе-наследнике. Смысл??? smile
instanceof оператор - зачем проверять, попадает ли проверяемый класс в список дерева наследования класса, экземпляром которого является проверяемый объект. smile
__autoload() - это вообще должно вызывать радость, теперь не надо явно инклудить! Супер!!!
Код

function __autoload($name) { 
    include_once('classes/' . $name . '.php');

__get(), __set() - имеет право на существование. Можно юзать!
__call() - немного не понятно, где можно было бы применить! smile

Пожалуйста, писать, только применение тех или иных функциональных возможностей, кто как себе представляет. Желательно сразу в коде!

Прошу не посылать на phpclub. Там уже всё перечитано...

Это сообщение отредактировал(а) Render - 13.8.2005, 12:00
PM   Вверх
Sardar
Дата 13.8.2005, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



По поводу абстрактных классов, уровней доступа, финальных методов/классов и т.д. - это всё тебе понадобиться как чуть глубже копнёшь в ООП. И интерфейс и абстрактный класс - это обьявление нового типа, но абстракный класс позволяет сделать костяк, некий общий базовый код. Например абстракный User, через который можно выбирать инфу о юзере, но заполнение инфы оставленно на потомка. А потомок может брать инфу из БД или сессии.

Уровни доступа нужны для логики, всегда есть способ выстрелить себе в ногу(через рефлекцию по момему можно достать приватные члены класса), но компилятор/интерпретатор постараються тебя остановить smile

Цитата(Render @ 13.8.2005, 10:54)
__autoload() - это вообще должно вызывать радость, теперь не надо явно инклудить! Супер!!!

Единственное что не понял, так это __autoload - зачем, (include|require)_once уже не в моде? smile К тому же если в require_once задать константу, а не выражение, то включение файла произойдёт до начала исполнения, что эффективно.

Цитата(Render @ 13.8.2005, 10:54)
__get(), __set() - имеет право на существование. Можно юзать!
__call() - немного не понятно, где можно было бы применить!

ИМXО, это грязная вещь для больших языков типа Java/C#, но очень удобно для скриптов. Позоволяет добавить "магии" в твои классы. Можешь сам написать SimpleXML - пример удобной и простой магии smile Или свой SOAP клиент:
Код
//допустим у нас в some.wsdl лежит декларация myFunction
$client = new SoapClient("some.wsdl");
//если бы не было __call, то пришлось бы писать:
$client->call('myFunction', array('param 1', 'param 2'));
//а так немного магии :)
$client->myFunction('param1', 'param 2');
//__call перехватит вызов и сделает всё необходимое

Если ты против "магии", то не используй. Но это удобно smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Render
Дата 13.8.2005, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 12.5.2005

Репутация: нет
Всего: 3



Насчёт, магии не против. smile __set и __get очень даже нужны, а насчет __call(), вот здесь действительно не понятно, где бы его можно применить.
Sardar
Код

//допустим у нас в some.wsdl лежит декларация myFunction    
$client = new SoapClient("some.wsdl");    
//если бы не было __call, то пришлось бы писать:    
$client->call('myFunction', array('param 1', 'param 2'));    
//а так немного магии :)    
$client->myFunction('param1', 'param 2');    
//__call перехватит вызов и сделает всё необходимое

не понял пример!?
PM   Вверх
Opik
Дата 13.8.2005, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 24
Всего: 55



__call юзается вроде несколько иначе.
пример:
Код

<?php
class Caller {
  private $x = array(1, 2, 3);

  function __call($m, $a) {
   print "Вызван метод $m :\n";
   var_dump($a);
   return $this->x;
  }
}

$foo = new Caller();
$a = $foo->test(1, "2", 3.4, true);
var_dump($a);
?> 

PM MAIL Skype   Вверх
Sardar
Дата 13.8.2005, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



SOAP - протокол вызова методов удалённых обьектов(тут много теории). Ты зачитываешь .wsdl с описанием доступных методов/функций вебсервиса. Впрочем другой пример:

Код
$table=new MyTable(); //таблица, допустим она имеет инфу
//....
foreach($table->rows as $row) { //выбрали все строки
  echo $row;
}

foreach($table->rows(0, 5) as $row) { //выбрали с первой по 5тую =)
  echo $row;
}

В первом примере заюзали магический __get, во втором магический __call smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Mal Hack
Дата 13.8.2005, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



__call это подобие перегрузки функций.
Что касается применения всех этих вещей. То нет жестких рамок, все заисит от конкретныхь задач и роли класса внутри всей системы. Так категорично что и где используеся говорить нельзя. ИМХО.
PM ICQ   Вверх
Guest
Дата 14.8.2005, 07:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Render На счет instanceof вот тебе пример - допустим у нас есть класс соединения с СУБД и есть интерфейс транзакций, но их поддерживают не все БД, тогда, чтобы это узнать instanceof будет как раз кстати. Простенький пример:

Код

interface transaction
{
  public function commit();
  public function rollback();
}

class db_base
{
...

  public function trasaction_support()
  {
    return ($this instanceof transaction);
  }
}

class db_mysql extends db_base
{
}

class db_oracle extends db_base implements transaction
{
  public function commit()
  {
  }

  public function rollback()
  {
  }
}


Т.е. для того, чтобы узнать поддержку транзакций экземпляром класса, достаточно вызвать метод transaction_support() базового класса!
  Вверх
<Spawn>
Дата 14.8.2005, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



Это был яsmile


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Estet
  Дата 10.5.2007, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 10.5.2007

Репутация: нет
Всего: нет



А что произойдет с __get() и __set() при наследовании?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0755 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.