PHP5 и PHP4, копирование обьекта

Paxan

Новичёк
PHP5 и PHP4, копирование обьекта

В PHP4 мы копировали обьект так:
PHP:
$copy_of_object = $object;
В PHP5 надо делать так:
PHP:
$copy_of_object = clone $object;
Как совместить в одном скрипте взависимости от версий 4-ой или 5-ой использовать тот или иной метод копирования обьекта. PHP4 ругается на строчку с "clone".

Зачем это надо? Просто на одном хостере стоит ПХП4, на другом ПХП5. Часто доделываю скрипты и заканывает каждый раз под каждый ПХП5 везде вставлять clone.

PS: есть идея serialize + unserialize, обьект примерно 20-30кб. Не будет ли тормозить слишком частое использование?
 

nightik

PHP5 BetaTeam
в 4-ке определи функцию:
PHP:
function clone( &$object )
{
    return $object;
}
в 5-ке её определять не надо

а все клонирования делай
PHP:
$copy = clone( $object );
-~{}~ 01.12.04 17:10:

а что бы совсем совместимости достигнуть определи функцию так:
PHP:
function &clone( &$object ) 
{ 
    $copy = $object;
    if ( method_exists( $object, "__clone" ) )
        $copy->__clone();
    return $copy; 
}
 

Paxan

Новичёк
1. PHP5 ругается на строку где "function clone". "Parse error: parse error, unexpected T_CLONE, expecting T_STRING".
2. на __clone "Fatal error: Cannot call __clone() method on objects - use 'clone $obj' instead"

PS: PHP Version 5.0.0

-~{}~ 01.12.04 14:41:

Код на всякие:
PHP:
class foo {
	var $var;
	function foo() {
		$this->var = "5";
	}

}

function &clone( &$object ) { 
    $copy = $object; 
    if ( method_exists( $object, "__clone" ) ) 
        $copy->__clone(); 
    return $copy; 
}

$obj = new foo();

$copy = clone($obj);
$copy->var = 6;

echo $obj->var;
echo $copy->var;
 

Profic

just Profic (PHP5 BetaTeam)
Paxan
никакими функциями не поможешь
попробуй zend.ze1_compatibility_mode (или как-то так) - это для php5
эта директива заставляет объект при присвоении копироваться. но при этом генерит толи notice, толи warning, то strict (скорее последнее)
 

svetasmirnova

маленький монстрик
никакими функциями не поможешь
Ну почему никакими?

Просто немножко неудобно будет

Нужно создать пользовательскую функцию для клонирования
PHP:
//php4 only
function my_clone($obj) {
    return $obj;
}
//end php4 only

//php5 only
function my_clone($obj) {
    return clone $obj;
}
//end php5 only

//both
class A {
    var $b;
}
$a = new A;
$b = my_clone($a);
$a->b = 0;
$b->b = 1;
echo $a->b;
echo $b->b;
Как лучше грузить функцию в зависимости от версии можно посмотреть в исходниках PEAR_PHP_Compat
 

Paxan

Новичёк
Всем большое спасибо :) Решилось всё благодаря eval()
Код на всякие :D
PHP:
class foo { 
    var $var; 
    function foo() { 
        $this->var = "5"; 
    } 

} 
if (intval(phpversion()) == 4) {
	eval('
		function clone (&$object) {
		    return $object; 
		}
	');
}

$obj = new foo(); 

$copy = clone($obj); 
$copy->var = 6; 

echo $obj->var; 
echo $copy->var;
-~{}~ 01.12.04 23:20:

Или можно еще так =)
PHP:
ini_set("zend.ze1_compatibility_mode","On");


class foo { 
    var $var; 
    function foo() { 
        $this->var = "5"; 
    } 

} 

$obj = new foo(); 

$copy = $obj; 
$copy->var = 6; 

echo $obj->var; 
echo $copy->var;
 
Сверху