Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: class php5 использование self и parent

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Маленький пример, как это работает....
ALEN
Отправлено: 25 Марта, 2010 - 10:30:06
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




Учил сегодня своего подопечного этой всей теме, точней пояснял, что и как работает, т.к. все готово - выложу и другим новичкам, как пример. В книжке сложновато на словах это все понять, а примеры не все любят сами писать и тестировать:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. class Person {
  4.     public static $name='1';
  5.  
  6.     function getName() {
  7.         return self::$name;
  8.     }
  9. }
  10.  
  11. class Person2 extends Person {
  12.     public static $name='2';
  13.  
  14.     function getName1() {
  15.         return parent::$name;
  16.     }
  17.     function getName2() {
  18.         return self::$name;
  19.     }
  20. }
  21.  
  22.  
  23. $person = new Person2();
  24. print $person->getName1(); // выведет  1
  25.  
  26.  
  27.  
  28. $person = new Person2();
  29. print $person->getName1(); // выведет  2
  30. ?>
  31.  


Т.е. в кратком и понятном виде на словах:
parent - вызов метода родительского класса
self - вызов метода текущего класса

Удобно использовать когда в текущем классе и родительском переменные или константы с одним и тем же именем, но в текущем классе нужно использовать значение и одного и другого.

(Отредактировано автором: 25 Марта, 2010 - 10:31:50)

 
 Top
like_you
Отправлено: 30 Ноября, 2010 - 00:45:28
Post Id


Гость


Покинул форум
Сообщений всего: 82
Дата рег-ции: Июнь 2010  
Откуда: Харківська обл. с. Криштопівка


Помог: 0 раз(а)





У Вас дважды создан объект Person2, а просто Person не создан. Скрипт выводит 11 заместо 12.


Подскажите, плиз, следующее:
1. Вызов внутри класа с помощью "self::" аналогичен до "$this->" или нет?
2. Зачем вообще нужен "static" при объявлении свойств или методов?
3. Есть ли разница когда объявить объект со скобками и без них типа:
$person = new Person()
или
$person = new Person

Спасибо.


-----
Створюю український хабр
 
 Top
OrmaJever Модератор
Отправлено: 30 Ноября, 2010 - 01:34:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




like_you пишет:
1. Вызов внутри класа с помощью "self::" аналогичен до "$this->" или нет?
2. Зачем вообще нужен "static" при объявлении свойств или методов?

второй вопрос это ответ на первый.
Если обьявить метод static то его можно использовать через self::method()
like_you пишет:
3. Есть ли разница когда объявить объект со скобками и без них типа:

Да есть. При создании обьекта ему сразу можно передать параметры. При создании обьекта php ищет метод __construct() если его нету то ещёт метод с название как у класа. Например.

PHP:
скопировать код в буфер обмена
  1. class test
  2. {
  3.      function __construct($var)
  4.      {
  5.            echo $var;
  6.       }
  7. }


PHP:
скопировать код в буфер обмена
  1. class test
  2. {
  3.      function test($var)
  4.      {
  5.            echo $var;
  6.       }
  7. }


Теперь при создании обьекта можно писать так
PHP:
скопировать код в буфер обмена
  1. $object = new test('Мы создали обьект с параметром'); // выведет текст
  2. // или так
  3. $object = new test; // просто создаёт обьект. Ничего не выводит.
  4.  


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
like_you
Отправлено: 30 Ноября, 2010 - 02:24:35
Post Id


Гость


Покинул форум
Сообщений всего: 82
Дата рег-ции: Июнь 2010  
Откуда: Харківська обл. с. Криштопівка


Помог: 0 раз(а)





по поводу того, о чём я писал предыдущем оф-топике:
наверное, в коде самого первого сообщения даной темы, достаточно было объявить один объект и вызывать методы, примерно вот так
PHP:
скопировать код в буфер обмена
  1. $person = new Person2();
  2. print $person->getName1(); // выведет  1
  3. print $person->getName2(); // выведет  2


И у меня добавились ещё вопросы в тему:
1. Когда целесообразнее использовать "$this->" и почему в некоторых случаях нужен "static" (и уже с ним "self::" ). Что меняет "static"? Мне показалось, что он управляет видимостью свойств и методов типа как модификатор доступа, но для этого же есть "public, protected, private";
2. Объекту нужны скопки при объявлении только в случаи если задавать параметр, тоесть при использовании метода-конструктор? А если просто пустые скобки без параметра это тоже самое, что объявить объект вообще без них?
3. Неужели роль конструктора в ООП пхп ограничивается только одновременной передачей параметра методу вместе с объявлением объекта?


-----
Створюю український хабр
 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Ноября, 2010 - 03:29:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Ой, ой.. При обьявлении в каком либо классе чего либо статического он автоматически становится абстрактным и созданию не подлежит. Поэтому в нем самом будет работать только self::, а в его потомках используют parent::
Можно конечно написать вместо parent:: написать Person:: но если имя класса слишком длинное, то короче писать parent::
 
 Top
Phantik
Отправлено: 30 Ноября, 2010 - 09:13:25
Post Id


Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Июнь 2009  


Помог: 0 раз(а)




like_you пишет:

по поводу того, о чём я писал предыдущем оф-топике:
наверное, в коде самого первого сообщения даной темы, достаточно было объявить один объект и вызывать методы, примерно вот так
PHP:
скопировать код в буфер обмена
  1. $person = new Person2();
  2. print $person->getName1(); // выведет  1
  3. print $person->getName2(); // выведет  2


И у меня добавились ещё вопросы в тему:
1. Когда целесообразнее использовать "$this->" и почему в некоторых случаях нужен "static" (и уже с ним "self::" ). Что меняет "static"? Мне показалось, что он управляет видимостью свойств и методов типа как модификатор доступа, но для этого же есть "public, protected, private";
2. Объекту нужны скопки при объявлении только в случаи если задавать параметр, тоесть при использовании метода-конструктор? А если просто пустые скобки без параметра это тоже самое, что объявить объект вообще без них?
3. Неужели роль конструктора в ООП пхп ограничивается только одновременной передачей параметра методу вместе с объявлением объекта?


$this->... используется всегда для обращения к собственным свойствам и методам.
static - объявление статической функции или статической переменной.
Отличие от обычной состоит в том, что статическая переменная принадлежит всему классу, а не некому экземпляру класса(объекту).
Если один объект поменяет свою статическую переменную, то она поменяется для всех объектов данного класса.
На практике, иногда такие переменные используются как счетчики числа созданных объектов.
Статическая функция - функция которую можно вызвать через класс, не создавая экземпляра объекта.
 
 Top
OrmaJever Модератор
Отправлено: 30 Ноября, 2010 - 10:45:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




like_you пишет:
2. Объекту нужны скопки при объявлении только в случаи если задавать параметр, тоесть при использовании метода-конструктор? А если просто пустые скобки без параметра это тоже самое, что объявить объект вообще без них?

нет. Ну это так же как и вызвать простую функцию, можно с параметрами а можно и без.
Если вызывать без скобок то просто создаст обьект, а если со скобками то будет вызыватся метод __construct()
Например
PHP:
скопировать код в буфер обмена
  1.  
  2. class test{
  3.      __construct(){
  4.           echo 'мы написали обьект со скобками.';
  5.      }
  6. }

Вот так можно и без параметра вызывать.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
ALEN
Отправлено: 30 Ноября, 2010 - 11:14:27
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




OrmaJever
Да в моем предыдущем посту, действительно опечатка:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class Person {
  3. public static $name='1';
  4. function getName() {
  5. return self::$name;
  6. }
  7. }
  8.  
  9. class Person2 extends Person {
  10. public static $name='2';
  11. function getName1() {
  12. return parent::$name;
  13. }
  14.  
  15. function getName2() {
  16. return self::$name;
  17. }
  18. }
  19.  
  20. $person = new Person();
  21. print $person->getName(); // выведет  1
  22.  
  23. $person2 = new Person2();
  24. print $person2->getName1(); // выведет  1
  25. print $person2->getName(); // выведет  1
  26. print $person2->getName2(); // выведет  2
  27.  
  28. ?>

(Отредактировано автором: 30 Ноября, 2010 - 11:15:43)

 
 Top
JustUserR
Отправлено: 30 Ноября, 2010 - 20:50:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




like_you пишет:
Вызов внутри класа с помощью "self::" аналогичен до "$this->" или нет?
В общем случае использование конструкций с указанием идентификатора класса в качестве текущего пространства имен в виде class:: или внутреннего квалификатора self:: - в действительности является дифференциированной грамматической конструкцией по сравнению с локальной ссылкой $this - для проверки факта которого достаточно использованя пользовательской функции переопределения обращения к параметру экземпляра класса


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB