про свойство класса

183
20 декабря 2017, 22:59

Есть класс А , в нем определены статично-публичное св-во $price и публичный статичный метод meth с данным св-вом $price, который присваивает внутри класса значение (self). есть класс B потомок класса А. Метод класса переопределен, внутри свойство $price класса А задано через ::parent. Вопрос, почему это свойство;$price пустое, если к нему обратится как A::$price? и как получить правильное значение...?

class A { 
    //public static $price;  
	static $orderPrice   = false; 
	 
    public static function meth() { 
        //self::$price = 1; 
		// здесь формирование массива $goods. 
	    $goods=array("0"=>1,"1"=>2); 
        self::setGoods($goods); 
		return $goods; 
    } 
	public static function setGoods($arOrderGoods){ 
		self::$goods = false; 
		 
		if(!self::$orderPrice){ 
			self::$orderPrice = 0; 
			foreach($arOrderGoods as $arGood) 
				self::$orderPrice += $arGood ; 
		} 
	} 
} 
 
class B extends A { 
    public static function meth($id) { 
	    // здесь формирование массива $goods. 
	    $goods=array("0"=>1,"1"=>2); 
        parent::setGoods($goods); 
		return $goods; 
    } 
} 
 
$ooods=B::meth(); 
echo A::$orderPrice; //"ничего не делает"

Если бы не было класса B, то A::$orderPrice; возвращает нормальный рез-т. пробовала B::$orderPrice пустое значение... Можно ли сделать так, чтобы класс А не менять, чтобы решить данный вопрос.

PS Если Вам известны хорошие ресурсы -практикуумы с ответами и объяснениями про классы пхп... Очень прошу сказать-)

Answer 1

конструкция A::$price; обращается на прямую переменной до вызова метода, присваивающего ей значение . Т.к. метод meth() у вас так и не был вызван, значит $price = null.

class A
{
    public static $price;
    public static function meth($value)
    {
        self::$price = $value;
        return static::$price; // LSB
    }
}
class B extends A
{
    public static $price;
    public static function meth($value)
    {
        parent::$price = $value;
        return A::$price;
    }
}
echo is_null(A::$price);   // 1
echo A::meth("value A");   // value A
echo B::meth("value B");   // value B
Answer 2

Нормально всё отрабатывает т.к. для статических методов и свойств действуют те же правила:

class A {
    public static $a;
    public static function getA() {
        self::$a = 'lala';
        return self::$a;
    }
}
class B extends A {
    public static function getA() {
        parent::$a = 'test';
        return A::$a;
    }
}
echo 'A::$a = '.A::getA().'; B::$a = '.B::getA();
READ ALSO
Суммирование с условием

Суммирование с условием

Добрый деньПишу SQL запрос, но не могу понять как реализовать

146
сделать рекурсивную выборку в Laravel 5.3 Mysql

сделать рекурсивную выборку в Laravel 5.3 Mysql

У меня есть таблица категорий (id,name,parent,root) и надо сделать рекурсивную выборкуВ модели

149
Рекрусивная функция в Битрикс, php [требует правки]

Рекрусивная функция в Битрикс, php [требует правки]

Нужно переписать код на рекурсивную функцию, желательно и объяснить как это работает

144
Проблема с Jquery, как решить?

Проблема с Jquery, как решить?

Есть страница indexphp в ней подключено jquery (jquery-1

187