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
Форумы портала PHP.SU :: Версия для печати :: class php5 использование self и parent
Форумы портала PHP.SU » PHP » Программирование на PHP » class php5 использование self и parent

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

1. ALEN - 25 Марта, 2010 - 10:30:06 - перейти к сообщению
Учил сегодня своего подопечного этой всей теме, точней пояснял, что и как работает, т.к. все готово - выложу и другим новичкам, как пример. В книжке сложновато на словах это все понять, а примеры не все любят сами писать и тестировать:
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 - вызов метода текущего класса

Удобно использовать когда в текущем классе и родительском переменные или константы с одним и тем же именем, но в текущем классе нужно использовать значение и одного и другого.
2. like_you - 30 Ноября, 2010 - 00:45:28 - перейти к сообщению

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


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

Спасибо.
3. OrmaJever - 30 Ноября, 2010 - 01:34:27 - перейти к сообщению
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.  
4. like_you - 30 Ноября, 2010 - 02:24:35 - перейти к сообщению

по поводу того, о чём я писал предыдущем оф-топике:
наверное, в коде самого первого сообщения даной темы, достаточно было объявить один объект и вызывать методы, примерно вот так
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. Неужели роль конструктора в ООП пхп ограничивается только одновременной передачей параметра методу вместе с объявлением объекта?
5. DeepVarvar - 30 Ноября, 2010 - 03:29:36 - перейти к сообщению
Ой, ой.. При обьявлении в каком либо классе чего либо статического он автоматически становится абстрактным и созданию не подлежит. Поэтому в нем самом будет работать только self::, а в его потомках используют parent::
Можно конечно написать вместо parent:: написать Person:: но если имя класса слишком длинное, то короче писать parent::
6. Phantik - 30 Ноября, 2010 - 09:13:25 - перейти к сообщению
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 - объявление статической функции или статической переменной.
Отличие от обычной состоит в том, что статическая переменная принадлежит всему классу, а не некому экземпляру класса(объекту).
Если один объект поменяет свою статическую переменную, то она поменяется для всех объектов данного класса.
На практике, иногда такие переменные используются как счетчики числа созданных объектов.
Статическая функция - функция которую можно вызвать через класс, не создавая экземпляра объекта.
7. OrmaJever - 30 Ноября, 2010 - 10:45:54 - перейти к сообщению
like_you пишет:
2. Объекту нужны скопки при объявлении только в случаи если задавать параметр, тоесть при использовании метода-конструктор? А если просто пустые скобки без параметра это тоже самое, что объявить объект вообще без них?

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

Вот так можно и без параметра вызывать.
8. ALEN - 30 Ноября, 2010 - 11:14:27 - перейти к сообщению
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. ?>
9. JustUserR - 30 Ноября, 2010 - 20:50:49 - перейти к сообщению
like_you пишет:
Вызов внутри класа с помощью "self::" аналогичен до "$this->" или нет?
В общем случае использование конструкций с указанием идентификатора класса в качестве текущего пространства имен в виде class:: или внутреннего квалификатора self:: - в действительности является дифференциированной грамматической конструкцией по сравнению с локальной ссылкой $this - для проверки факта которого достаточно использованя пользовательской функции переопределения обращения к параметру экземпляра класса

 

Powered by ExBB FM 1.0 RC1