Есть класс А , в нем определены статично-публичное св-во $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 Если Вам известны хорошие ресурсы -практикуумы с ответами и объяснениями про классы пхп... Очень прошу сказать-)
конструкция 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
Нормально всё отрабатывает т.к. для статических методов и свойств действуют те же правила:
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();
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
У меня есть таблица категорий (id,name,parent,root) и надо сделать рекурсивную выборкуВ модели
Нужно переписать код на рекурсивную функцию, желательно и объяснить как это работает