Проблема с ООП.

R
На сайте с 03.08.2012
Offline
131
384

Здравствуйте, сейчас осваиваю ООП, возникли проблемы. Просто стопор, не могу понять как сделать...

Вот у меня абстрактный класс:

abstract class upload {

protected static $dir;

public static function get()
{
return self::$dir;
}

}

Класс наследник:

class upload_text extends upload {

protected static $dir = "text";

}

Подключаю файлы, пишу echo upload_text::get();

У меня нечего не работает, т.е. значение $dir не передаеться вообще.

А вот допустим если в родительском классе напишу так:

public static function get()
{
return upload_text::$dir;
}

То работает. Что за бред? Подскажите, пожалуйста, как передавать данные между классами, почему не работает?

IL
На сайте с 20.04.2007
Offline
435
#1
revered:
почему не работает?

потому что static. Версия PHP какая?

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
bay_ebook
На сайте с 28.05.2010
Offline
111
#2

Могу ошибиться, некогда вникать. Но вроде все методы, объявленные в абстрактном классе должны быть объявленные и в дочернем классе.

ПС - некогда вникать, мог ошибиться, нужно мануал глянуть в этом направлении.

Нужен прогер на php+mysql+понимание чужего кода? (/ru/forum/540660) Вам сюда PHP-шаман (http://php-shaman.pw/)
ukrdev
На сайте с 15.11.2011
Offline
31
#3

revered, используя self вы обращаетесь к свойству которое находится в родителе(upload), а оно пустое, поэтому и возвращает null.

1. Или переопределите(продублируйте) метод get в дочернем классе, что бы он ссылался уже на своё свойство dir

2. Или обратитесь к свойству не через self, а через static


return static::$dir;
IL
На сайте с 20.04.2007
Offline
435
#4
bay_ebook:
Могу ошибиться, некогда вникать. Но вроде все методы, объявленные в абстрактном классе должны быть объявленные и в дочернем классе.

Тут не надо вникать, тут надо понимать разницу между "просто" методом абстрактного класса и абстрактным методом абстрактного класса.

Методы, реализованные (имеющие реализацию в абстрактном классе) и методы объявленные (помеченные как abstract в абстрактном классе) - это "две большие разницы" (с)

R
На сайте с 03.08.2012
Offline
131
#5
ukrdev:
revered, используя self вы обращаетесь к свойству которое находится в родителе(upload), а оно пустое, поэтому и возвращает null.

1. Или переопределите(продублируйте) метод get в дочернем классе, что бы он ссылался уже на своё свойство dir
2. Или обратитесь к свойству не через self, а через static


return static::$dir;

2 метод помог. Спасибо большое, теперь я понял, что в таких случаях нужно обращаться через статик, а я даже незнал, что так можно :)

Спасибо большое, очень помогли!

F9
На сайте с 13.04.2008
Offline
104
#6

Late static binding - это одна из киллер-фич PHP v5.3, очень ее не хватало в свое время...

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий