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

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

1. Golovastik - 03 Июля, 2010 - 01:02:43 - перейти к сообщению
На яве для вызова конструктора суперкласса используют ключевое слово super, пробую на пхп практиковать не выходит.
Вот код на Java рабочий
CODE (text):
скопировать код в буфер обмена
  1.  
  2. package u;
  3.  class A{
  4. private int a,b,c;
  5. A(){}
  6. A(int x1, int y1, int z1){
  7.     a = x1; b = y1; c = z1;
  8.  }
  9.  
  10.  
  11. void result(){
  12.    System.out.println(a*b*c);
  13. }
  14. }
  15.  
  16.  class B extends A{
  17.     B(){}
  18.     B(int s1, int s2, int s3){
  19.         super(s1,s2,s3);
  20.     }
  21. }
  22.  
  23. public class Main {
  24.     public static void main(String[] args) {
  25.      B obj = new B(5,7,9);
  26.      obj.result();
  27.     }
  28. }
  29.  
  30.  


На пхп застряло на 15 строке и не идёт:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. class Base {
  4.  
  5. private  $a, $b, $c;
  6. function Base($x, $y, $z){
  7.     $a = $x; $b = $y; $c = $z;
  8. }
  9.  function result(){
  10.     echo $a*$b*$c;
  11.  }
  12. }
  13.  
  14. class B extends Base {
  15.   function B($w1,$w2, $w3){
  16.   super($w1,$w2,$w3);  
  17.   }
  18.  }
  19.  
  20. $obj = new B;
  21. $obj->result();
  22.  
  23. ?>
  24.  
  25.  
2. Nestor - 03 Июля, 2010 - 02:23:23 - перейти к сообщению
функции super, насколько я помню, нет.
попробуй вызвать через parent::__construct()
3. JustUserR - 03 Июля, 2010 - 02:40:42 - перейти к сообщению
Golovastik пишет:
На пхп застряло на 15 строке и не идёт:
В PHP концепции и элементы объектно-ориентированного программирования активно используются - однако его реализация не является такой полной как например в языке Java В частности в PHP для доступа к полям и функциям текущего класса можно использовать как конструкцию self::field так и $this->field - то есть класс и объект являющийся экземпляром класса не разделены в коде описания класса полностью Видимо такой синтаксис заимствован из C++ где его использование реально оправдано - что можно увидеть к примеру при просмотре генерируемого C-кода - поскольку свойства класса там на самом деле являются свойствами одноименной структуры а функции находятся отдельно от объекта с пространстве имен совпадающем с именем класса
4. Golovastik - 03 Июля, 2010 - 11:41:46 - перейти к сообщению
Вот так не работает.
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class Base {
  4.  
  5. private  $a, $b, $c;
  6. function Base($x, $y, $z){
  7.     $this->a = $x; $this->b = $y; $this->c = $z;
  8. }
  9.  function result(){
  10.     echo $this->a*$this->$b*$this->c;
  11.  }
  12. }
  13.  
  14. class B extends Base {
  15.   function B($w1,$w2, $w3){
  16.   parent::__constructor($w1,$w2,$w3);
  17.   }
  18.  }
  19.  
  20. $obj = new B;
  21. $obj->result(1,2,3);
  22.  
  23.  
5. movEAX - 03 Июля, 2010 - 13:11:41 - перейти к сообщению
Golovastik пишет:
parent::__constructor($w1,$w2,$w3);

Не __constructor, а __construct
6. Golovastik - 03 Июля, 2010 - 17:44:33 - перейти к сообщению
Хоть вот эту строку и понял как использовать но не понял что означает вот это выражение.
PHP:
скопировать код в буфер обмена
  1.  
  2.  parent::__construct($w1,$w2,$w3);
  3.  

parent - это класс языка пхп как я понял.
__construct - это область видимости метода в этом классе?
7. alexspb - 03 Июля, 2010 - 19:27:07 - перейти к сообщению
на месте
PHP:
скопировать код в буфер обмена
  1. function Base($x, $y, $z){
  2.     $a = $x; $b = $y; $c = $z;
  3. }

и должен быть __construct()

PHP:
скопировать код в буфер обмена
  1. __construct($x, $y, $z){
  2.     $this->a = $x; $this->b = $y; $this->c = $z;
  3. }


имя класса и конструктора совпадало в РНР4, в РНР5 - __construct()
8. mako - 03 Июля, 2010 - 21:41:20 - перейти к сообщению
alexspb пишет:
Хоть вот эту строку и понял как использовать но не понял что означает вот это выражение.

parent:: -- обращение к методу родительского класса

__construct() -- функция которая вызывается при создании экземпляра класса.
Другими словами:
CODE (htmlphp):
скопировать код в буфер обмена
  1. parent::__construct();

"Автоматически вызвать функцию __construct родительского класса при создании обьекта этого класса"
9. JustUserR - 04 Июля, 2010 - 02:08:15 - перейти к сообщению
Golovastik пишет:
Хоть вот эту строку и понял как использовать но не понял что означает вот это выражение.
Если вы используете PHP4-нотацию для записи конструктора в классе - то соответствующий вызов будет выглядеть как parent::Base()
Golovastik пишет:
Parent - это класс языка пхп как я понял.
__construct - это область видимости метода в этом классе?
В PHP для классов реализовано только единственное наследование - и parent означает просто доступ к функциям базового класса Что касается областей видимости то ситуация в PHP по этому вопросу складывается еще более интересная По умолчанию в PHP присутствует только глобальная и локальная область видимости причем глобальная область является межпакетной - и нет в наличии стандартных пакетных или именнованных пространств имен - но тем не менее имя класса и оператор расширения области видимости могут использоваться для эмуляции пространств имен - в частности с помощью пакета runkit можно добиться получения собственных динамических пространств имен
Если рассматривать синтаксис вызова методов внутри класса то можно заметить что он несколько необычен для PHP - и причиной этого является того что фукнции в PHP ранее не были объектами первого рода Дело в том что обычная переменная может быть или глобальной и тогда для получения к ней используется ключевое слово global - или локальной и в таком случае она существует внутри определенной фукнции по правилу перекрытия В то же время все функции первоначально находились в глобальной области - и поэтому могут вызываться из нее без всяких ключевых слов - но с появлением классов потребовалась необходимость обращаться к его функциям определенным образом - и так как синтаксис простого вызова уже был занят глобальными функциями то для этой цели стали использовать оператор расширения области видимости по имени классу Казалось бы что с переменными находящимися внутри класса такой проблемы не было и их можно было бы использовать без всякого префикса - однако они используются фактически не внутри класса а внутри его методов которые сами могут содержать локальные переменные - и по этой причине а также для логического объединения свойств и методов класса стал использоваться такой синтаксис То есть по сути класс можно рассматривать как набор переменных и функций внутри определенного пространства имен - которое существует наряду с глобальным пространством и подчиняется таким же правилам

 

Powered by ExBB FM 1.0 RC1