Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > PHP, первые шаги...


Автор: Vit 16.9.2005, 16:06
Начал немного разбираться, пока пытаюсь понять логику построения языка.

1. Поддерживает ли PHP множественное наследование, если да то как?
2. Как объявить абстрактный метод?
3. Как перекрыть метод в родительском классе?
4. Как обратится к методу класса-предка?
5. Как определить события?
6. Как объявить свойство,работа с которым происходит через приватные методы?
7. Есть ли возможность работать с ссылками?
8. Процедура должна быть объявлена обязательно до места её использования или в любом месте? Если обязательно "до", то как сделать forward declaration.
9. Реализованные ли механизмы RTTI? Другими словами можно ли достучаться до дескрипторов типов, например есть класс A, я могу узнать есть ли у него метод B или нет?
10. Есть ли в PHP возможность удалённых вызовов?


Прошу особо не пинать ногами, только сел за PHP - опыта никакого, пытаюсь просто понять как эта штука работает и как её применять...

Автор: Sardar 16.9.2005, 17:11
Цитата(Vit @ 16.9.2005, 15:06)
1. Поддерживает ли PHP множественное наследование, если да то как?

Нeт, но поддерживает интерфейсы как Java. Xотя не нужно подходить с жёсткими мерками к скриптовым языкам, то что делаеться громоздко в C#/Java, в PHP5 делаеться гораздо проще. Пишем магический метод __call - который будет перехватывать все вызовы не существующих методов, таким образом можно собрать любой динамический интерфейс. Переменные естественно могут в любой момент создасться новые.

Цитата(Vit @ 16.9.2005, 15:06)
2. Как объявить абстрактный метод?
3. Как перекрыть метод в родительском классе?

Всё как в Java, пишем abstract function bla($arg, &$arg2, SomeClass $arg3, ...);
Для переопределения также не требуються никакие ключевые слова, как и в Java.

Цитата(Vit @ 16.9.2005, 15:06)
4. Как обратится к методу класса-предка?

Только обьект потомок может обратиться к parent::method, для внешнего мира никак.

Цитата(Vit @ 16.9.2005, 15:06)
5. Как определить события?

А зачем они в PHP? В C# события - это лишь немного скрытой работы компилятора, создаються списки слушателей и т.д. В PHP также как и в Java, всё в ручную.

Цитата(Vit @ 16.9.2005, 15:06)
6. Как объявить свойство,работа с которым происходит через приватные методы?

Есть магические __get и __set, через которые организуем работу с несуществующими полями, существующие публичные будут доступны на прямую. Также можно реализовать интерфейс ArrayAccess и получить возможность работать с обьектом как с массивом, передавая как числовые так и строковые ключи. Очень удобно.

Цитата(Vit @ 16.9.2005, 15:06)
7. Есть ли возможность работать с ссылками?

Да, но ограниченно. Передавать по ссылке нельзя ибо не логично, интерпретатор будет выкидывать предупреждение(которое можно отключить). В методе можно обьявить параметр как ссылку, тогда получать будет ссылку, а не значение. Обьекты всегда передаються как ссылки, массивы не обьекты, передаються как копии.

Цитата(Vit @ 16.9.2005, 15:06)
8. Процедура должна быть объявлена обязательно до места её использования или в любом месте? Если обязательно "до", то как сделать forward declaration.

PHP это интерпретируемый язык, ошибка будет в момент обращения к функции/методу. Если такой метод своевременно появиться, то всё будет работать. НО! это грязная практика, приводящая ИМXО к труднонаходимым ошибкам. Деклараций наперёд прототипов функций/методов нет.

Цитата(Vit @ 16.9.2005, 15:06)
9. Реализованные ли механизмы RTTI? Другими словами можно ли достучаться до дескрипторов типов, например есть класс A, я могу узнать есть ли у него метод B или нет?

Да. PHP это скриптовый язык, очень похож на Java, хотя даёт гораздо больше свободы из-за своей скриптовой сущсности.

Цитата(Vit @ 16.9.2005, 15:06)
10. Есть ли в PHP возможность удалённых вызовов?

Есть XML RPC/SOAP библиотеки. Идут как PECL расширения.

Всё сказанное относиться к PHP5. При изучении главное помнить, что это скриптовый язык, т.е. можно создать функцию в любой момент(лямбда функция), сделать почти любые "магические" фичи(смотрим методы __* и нативные интерфейсы Zend 2), вообще свобода ограничиваеться лишь воображением, а не языком smile

Автор: Vit 16.9.2005, 20:22
Цитата(Sardar @ 16.9.2005, 08:11)
Обьекты всегда передаються как ссылки, массивы не обьекты, передаються как копии.


Т.е. передать массив как ссылку я не могу?

Цитата(Sardar @ 16.9.2005, 08:11)
НО! это грязная практика, приводящая ИМXО к труднонаходимым ошибкам. Деклараций наперёд прототипов функций/методов нет.



Ну а как реализуется что-то типа такого:

Код

function a($чего-то там)
{
  //чего-то делаем
  b($чего-то там);
  //чего-то делаем
};

function b($чего-то там)
{
  //чего-то делаем
  a($чего-то там);
  //чего-то делаем
};

Автор: Mayk 16.9.2005, 20:28
Цитата(Vit @ 17.9.2005, 00:22)

Ну а как реализуется что-то типа такого:

Точно так, как ты написал.
Код

function  a($s){
    print "a".$s."\n";
    if($s > 4) b($s-1);
}
function b($s){
    print "b".$s."\n";
    if($s > 4) a($s-1);

}
b(10);

Автор: Sardar 16.9.2005, 22:44
Цитата(Vit @ 16.9.2005, 19:22)
Т.е. передать массив как ссылку я не могу?

Повторяю - единственное ограничение это твоё воображение и желание пробовать smile
Код
function test(&$by_link=array()) {
  $by_link[0]="after test";
}

$r=array("before test");
test($r);
print_r($r); //[0] after test

Дефолтные значения для ссылок - фича PHP5.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)