T. Anre
Новичок
ООП и ссылки в PHP4
Недавно написал небольшой класс-диспетчер для РНР4.
Но механизм работы кажется сомнительным.
Вот небольшой пример показывающий работу данного класса.
Интересует следующее:
1. Есть ли здесь утечки памяти?
3. Правильно ли работает механизм ссылок?
PHP:
<?php
// файл xsf.php
// комментарии JavaDoc
/**
* Диспетчер объектов
*/
class xsf {
/**
* Регистрация нового объекта
*
* @access public
* @return mixed
*/
function &set_object($str_obj_name=NULL) {
if ( strlen($str_obj_name) ) {
if ( !isset($GLOBALS['object_space']) OR !is_array($GLOBALS['object_space']) ) {
$GLOBALS['object_space'] = array();
}
$obj = &$GLOBALS['object_space'];
$obj[$str_obj_name] = &new $str_obj_name;
$methods = get_class_methods($str_obj_name);
if (in_array('start',$methods)) {
$obj[$str_obj_name]->start();
}
return $obj[$str_obj_name];
}
else {
return false;
}
}
/**
* Получить "ссылку" на объект( в данном случае ссылка не объектная)
*
* @access public
* @return mixed
*/
function &get_object($str_obj_name=null) {
$obj = &$GLOBALS['object_space'];
if ( strlen($str_obj_name) ) {
if ( is_object($obj[$str_obj_name]) ) {
return $obj[$str_obj_name];
}
else {
return false;
}
}
else {
return false;
}
}
/**
* Получить список инициализированных объектов
*
* @access public
* @return array
*/
function &get_objects_list() {
$obj_list = array();
if ( isset($GLOBALS['object_space']) AND is_array($GLOBALS['object_space']) ) {
foreach ($GLOBALS['object_space'] AS $key=>$value) {
array_push($obj_list,$key);
}
}
return $obj_list;
}
}
?>
Но механизм работы кажется сомнительным.
Вот небольшой пример показывающий работу данного класса.
PHP:
<?php
require('xsf.php');
class A extends xsf {
/**
* Constructor of class A
*/
function start() {
echo "A started";
$this->x = 'variable A';
}
function get() {
$b = &$this->get_object('B');
echo $b->x;
}
}
class B extends xsf {
/**
* Constructor of class B
*/
function start() {
echo "B started";
$this->x = 'variable B';
}
function get() {
$a = &$this->get_object('A');
echo $a->x;
}
}
$xsf = &xsf::set_object('xsf');
$A = &$xsf->set_object('A');
$B = &$xsf->set_object('B');
$A->get();
$B->get();
?>
1. Есть ли здесь утечки памяти?
3. Правильно ли работает механизм ссылок?