PHP :: Операции с объектами
http://belarusweb.net
Основы создания сайтов

PHP :: Операции с объектами

Перечисление свойств объектов

При работе с объектами может возникнуть необходимость в последовательном перечислении свойств текущего объекта. В этом случае может пригодиться известный нам цикл foreach, который позволяет получить доступ ко всем открытым для него свойствам и их значениям (см. пример №1).

PHP Результат BwCodes
<?php

class iter_class{
	//Общедоступное 
	public $var_1='value_1';						      
	//Общедоступное 
	public $var_2='value_2';						      
	
	//Защищенное
	protected $protected_var='protected_var';	
	//Закрытое
	private   $private_var='private_var';		  

	//Метод для перечисления свойств
	function iterate_properties(){				    
		
		echo "Свойства класса iter_class, 
				перечисляемые циклом изнутри класса:<br>";
		
		//Перечисляем внутри класса
		foreach($this as $key=>$value){			   
			echo "{$key}=>{$value}".'<br>';
		}
		
	}
}

$class = new iter_class();
$class->iterate_properties();

echo "<br> Свойства класса iter_class, 
		перечисляемые циклом снаружи класса:<br>";
//Перечисляем снаружи класса
foreach($class as $key=>$value){					   
    echo "{$key}=>{$value}".'<br>';
}

?>

Пример №1. Перечисление свойств объектов циклом foreach

Как видим, цикл foreach перечисляет все доступные для него в данной области видимости свойства объекта так, как-будто он имеет дело с обычным массивом.

Возможности PHP по итерации объектов не исчерпываются только лишь циклом foreach, поскольку для этих целей имеются также и специальные интерфейсы, позволяющие реализовывать итерацию объектов практически любым удобным для программиста способом. Однако здесь мы их рассматривать не будем, а вернемся к этому вопросу во второй части учебника.

Сравнение объектов

Также как и другие типы данных, объекты можно сравнивать между собой. При использовании оператора нестрогого сравнения '==' два объекта будут считаться равными, если они являются экземплярами одного и того же класса и имеют один и тот же набор свойств и соответствующих им значений. А в случае использования оператора идентичности '===', объекты будут считаться тождественно равными (идентичными) только тогда, когда они ссылаются на один и тот же экземпляр одного и того же класса (см. пример №2).

<?php

class my_class_1{
	//Общедоступное 
	public $var_1='value_1';							    
	//Защищенное
	protected $protected_var='protected_var';	
	//Метод класса
	public function func(){							     	
		echo 'Функция func';
	}
}

class my_class_2{
	//Общедоступное 
	public $var_1='value_1';							    
	//Защищенное
	protected $protected_var='protected_var';	
	//Метод класса
	public function func(){							    	
		echo 'Функция func';
	}
}

//Создаем объекты одного и того же класса
$obj_1=new my_class_1();
$obj_2=new my_class_1();

//Выведет '1' (т.е. true), т.к. объекты принадлежат
//одному классу, имеют одинаковые свойства и их значения
echo $obj_1==$obj_2; 	    

//Выведет '' (т.е. false), т.к. объекты принадлежат								        
//одному классу, но являются разными экземплярами
echo $obj_1===$obj_2;     
							          
//Изменим значение свойства второго объекта								
$obj_2->var_1='new value';

//Выведет '' (т.е. false), т.к. объекты принадлежат одному классу, имеют
//одинаковые свойства, но значения одного из них ($var_1) различаются
echo $obj_1==$obj_2; 	      
									        
$obj_3=$obj_1; 				

//Выведет '1' (т.е. true), т.к. переменные содержат
//ссылки на один и тот же экземпляр (new my_class_1)
echo	$obj_3===$obj_1;		  
									
//Создаем объект другого класса
$obj_4=new my_class_2();  								 

//Выведет '' (т.е. false), т.к. объекты принадлежат разным классам			
echo	$obj_4==$obj_1;		  					 

?> 

Пример №2. Сравнение объектов

Отметим, что расширения могут определять собственные правила для сравнения своих объектов.

Клонирование объекта, оператор clone

Как говорилось выше, когда мы присваиваем одну переменную, содержащую идентификатор какого-нибудь объекта, другой переменной, мы получаем две переменные, содержащие один и тот же идентификатор, указывающий на один и тот же объект. Если же нам необходимо создать именно копию объекта, а не копию его идентификатора, то необходимо воспользоваться оператором clone, который создаст объект с полностью идентичными свойствами, которые можно изменить по своему усмотрению при помощи метода __clone, вызывающегося только при каждом новом клонировании объекта (см. пример №3).

PHP Результат BwCodes
<?php

class cloneable_class{
	//Создаем свойство
	public $var_1=0;					
		
	//Каждый раз при создании нового объекта
	public function __construct(){  
	  //$var_1 будет увеличиваться на 1
	  ++$this->var_1; 				 
	}
	
	//Метод запускается только при клонировании
	public function __clone(){ 
	  //объекта и увеличивает $var_1 на 1
	  ++$this->var_1; 				 
	}
}

//Создаем объект класса cloneable_class
$obj_1 = new cloneable_class(); 

//Теперь копируем идентификатор, который указывает на
//new cloneable_class(), при этом метод __clone не запускается
$obj_2=$obj_1; 				 		 
//Выведет '1'
echo $obj_1->var_1.'<br>';		 
//Выведет '1'
echo $obj_2->var_1.'<br>';		 

//Изменили значение свойства на 5 
$obj_1->var_1=5;					 	  
//Выведет '5', т.к. обе переменные ссылаются на один и тот же объект 
echo $obj_2->var_1.'<br>';													 

//Клонируем $obj_1, при этом создается 
//реальный объект-клон с запуском метода__clone 
$obj_3=clone $obj_1; 				
//Выведет '5'
echo $obj_1->var_1.'<br>';		 		 
//Выведет '6'
echo $obj_3->var_1.'<br>';		 

//Изменили значение исходного объекта на 10
$obj_1->var_1=10;					 	  
//Выведет по-прежнему '6', т.к. переменные $obj_3 
//и $obj_1 ссылаются на разные объекты 
echo $obj_3->var_1;
					 
?>

Пример №3. Клонирование объектов

Таким образом, если мы собираемся клонировать объект и хотим при клонировании изменить некоторые его свойства, то необходимо заранее в исходном классе объявить метод __clone, который будет вызываться по завершении каждого нового процесса клонирования объекта. При этом нужно помнить, что вызов данного метода не может быть выполнен непосредственно. В случае отсутствия метода __clone в исходном объекте в результате клонирования будет создана простая неизмененная копия объекта. В любом случае после создания клон станет доступным для независимого использования.

Быстрый переход к другим страницам