Задать вопрос
Ninazu
@Ninazu

Как реализовать заполнение статических свойств в наследуемых классах из родительского?

Что-то я запутался со static. Точнее с тем как с его помощью можно сделать синглтон.

<?php

/** Описание обьекта B */
class B extends Base {}

/** Описание обьекта А */
class A extends Base {}


class Base {

	public static $comment;
	
	public static $name;
	
	public function __construct(){
		//Нет смысла выполнять этот код для каждого экземпляра класса
		//так как комментарий и имя статичны для класса
		
		//if(is_null(static::$name)){
			$reflect = new ReflectionClass(static::class);
			static::$comment = $reflect->getDocComment();
			static::$name = $reflect->getShortName();
			echo "<br>Получение Reflect данных для класса ".static::$name;
		//}
	}
}


echo "<pre>";

for($i=0;$i<3;$i++){
	$list = [];
	
	foreach(['A','B'] as $className){
		$class = new $className();
		$list[$class::$name] = $class::$comment;
	}
	
	echo "<br>";
	print_r($list);
	echo "<hr>";
}

PHP Fiddle

Как видно из кода, нет смысла инициализировать статические свойства для каждого обьекта, они должны быть инициализированы один раз для каждого класса
  • Вопрос задан
  • 147 просмотров
Подписаться 1 Простой 7 комментариев
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
class Foo{

    public static function changeTest()
    {
	static::$test = '321';
    }
}

class Bar extends Foo
{
	public static $test = 123;
}

var_dump(Bar::$test);
Bar::changeTest();
var_dump(Bar::$test);


Но это очень плохой подход. Родительский класс вообще ничего не должен знать про дочерний
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽