@AlikDex

Внутри объекта не меняются свойства статического класса. Почему?

Итак. Есть коллекция объектов из базы данных, выглядит так:
<?php

class Sites
{
		// Коллекция объектов
    public static $site = array();

    private function __construct() {} // сделаем приватной, чтоб не создавался инстанс.

		// функция добавления объекта в коллекцию
    public static function add($id, $obj)
    {
        if ( is_object($obj) ) {
        	self::$site[$id] = $obj;
        }
    }

}


Добавим в коллекцию объект с данными о сайте.

<?php
$query = $db->prepare("SELECT * FROM `sites` WHERE site_id=:id");
$query->bindValue(':id', $id, PDO::PARAM_INT);

if ($query->execute()) {	

		$st = $query->fetch(PDO::FETCH_OBJ);
		
		$id = (int) $st->site_id;
		
		Sites::add($id, $st);
		
		echo "<pre>";
		var_dump(Sites::$site[$id]);
		echo "</pre>";

			/*object(stdClass)#4 (2) {
			  ["site_id"]=>
			  string(2) "10"
			  ["site_name"]=>
			  string(7) "Test123"
			}*/
		
		
			// меняем свойство и добавляем новое.		
		Sites::$site[$id]->site_name = "Name changed";
		Sites::$site[$id]->addedProperty = "successful added";
		
			// Сотрим.
		echo "<pre>";
		var_dump(Sites::$site[$id]);
		echo "</pre>";

			/*object(stdClass)#4 (3) {
			  ["site_id"]=>
			  string(2) "10"
			  ["site_name"]=>
			  string(12) "Name changed"
			  ["addedProperty"]=>
			  string(16) "successful added"			  
			}*/
	
		
			// Создаем экземпляр объекта парсера
			// пробуем изменить свойства статического объекта внутри другого объекта.
		$parser = new StatsParser();
		$parser->parseStats();
		
			// Смотрим получилось ли изменить??
		echo "<pre>";
		var_dump(Sites::$site[$id]);
		echo "</pre>";

			/*object(stdClass)#4 (3) {
			  ["site_id"]=>
			  string(2) "10"
			  ["site_name"]=>
			  string(12) "Name changed"
			  ["addedProperty"]=>
			  string(16) "successful added"			  
			}*/
			
			// Как видим, не получилось.
}


Упрощено класс парсера выглядит примерно так:
<?php
class StatsParser {
	public function parseStats ()
	{
		
		if (! empty(Sites::$site)) {
			foreach (Sites::$site as $st) {
				$id = (int) $st->site_id;
				
					// меняем свойство и пробуем добавить еще 1.		
				echo Sites::$site[$id]->site_name = "Test123";  // ничего не вывелось
				echo Sites::$site[$id]->visited = 200; // ничего не вывелось
				
			}
		}
	}
}
  • Вопрос задан
  • 173 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 22:48
100 руб./за проект
19 апр. 2024, в 20:43
20000 руб./за проект