[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Наследование абстрактного класса
wollk
Есть абстрактный класс
abstract class Module{
static $path;
protected $name;

function __construct($name,$path)
{
$this->name = $name;
self::$path=$path;
$this->start();
}
static function get_path(){return self::$path;}
abstract protected function start();
}


Его наследуют два другие класса: Class_One и Class_Two
Проблема с заданием значения статическому свойству path. Экземляры двух классов создаются друг за другом, и у обоих? при вызове Class_One::get_path(), получаю свойство path, указанное в последний раз.
Т.е.:
$one = new Class_One("1","m/1");
$two = new Class_Two("2","m/2");
при вызове Class_One::get_path() получу "m/2";
На сколько я понял, они оба изменяют свойство у абстрактного класса, а не у себя. Как же правильно сделать, чтобы не прописывать эти функции для каждого отдельно ?
wollk
Цитата (Invis1ble @ 9.03.2015 - 21:09)
https://php.net/manual/ru/language.oop5.lat...ic-bindings.php

Хм.. заменил в конструкторе и в get_path() self на static, но не помогло (( Все равно возвращает path второго класса. Видимо что-то не так делаю (
Guest
Может объявить $path абстрактным и иницрализировать в классах One,Two?
AllesKlar
wollk

Каждый из твоих классов-наследников должен иметь свою static $path;

Для более простого понимания, посмотрим на это дело физически.

Что такое статическая переменная класса на физическом уровне? Это определенная ячейка памяти, куда записано значение этой переменной.

И хоть пиши self:: хоть static:: все равно по одному и тому же адресу в памяти будет перезаписано значение.

Если же у твоих классов наследников есть собственные переопределенные static $path, то физически мы имеем 3 ячейки памяти. Первая - static $path класса Module, вторя static $path класса Class_One и третья static $path класса Class_Two

А манипуляции с поздим статическим связыванием или отсутсвие таковых, в зависимости от того, что ты укажешьstatic:: или self:: не делает ничего другого, как выбирает соответсвующую переменную из этих трех.


abstract class Module{
static $path;
protected $name;

function __construct($name,$path)
{
$this->name = $name;
static::$path=$path;
}
static function get_path(){return static::$path;}

}



class one extends Module
{
static $path;
}

class two extends Module
{
static $path;
}

$one = new one("1","m/1");
$two = new two("2","m/2");

echo one::get_path() . '<br>';
echo two::get_path() . '<br>';


Guest
У тебя отсутвует понимание абстракции. свойство класса не может быть абстрактным, это парадокс.

_____________
[продано копирайтерам]
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.