2008-09-23 2 views

답변

6

당신은 할 수 귀하 클래스는 비어있는 것을 인스턴스화 해, 임의의 수의 메소드에 의해로드됩니다. 이러한 방법 중 하나는 PHP는 객체가 배열에 다른 전체를 많이하지 않고, 모든 PHP 4 개체입니다

class childClass extends parentClass 
{ 
    function childClass() 
    { 
     //do nothing 
    } 

    function loadFromParentObj($parentObj) 
    { 
     $this->a = $parentObj->a; 
     $this->b = $parentObj->b; 
     $this->c = $parentObj->c; 
    } 
}; 

$myParent = new parentClass(); 
$myChild = new childClass(); 
$myChild->loadFromParentObj($myParent); 
+0

이것은 현재 사용하는 솔루션이 적습니다. 나는 다른 어떤 마법도 이것을 기대할 수 없다고 생각한다. –

1

내가 당신에게 것 상상 PHP4 할 필요가 원래 객체의 하위 클래스입니다 일종의 "복사 생성자"를 만들어야합니다. 그런 다음 원본 객체를 전달하면서 새 하위 클래스 객체를 만듭니다.

2

가장 좋은 방법은 당신이 할 수 있도록 서브 클래스에 clone 메소드를 작성하는 것입니다 :

$myvar = $subclass->clone($originalObject) 

을 당신이 데코레이터 패턴으로 볼 수 있었던 것처럼 다른 방법으로는 소리 php example

+0

복제본을 직접 구현하지 않는 한 PHP4는 사용하지 않습니다. –

3

거기에서 데이터를 복사 한 후 인수로 부모 클래스의 인스턴스를 적용하고 수

function clone($object, $class) 
{ 
    $new = new $class(); 
    foreach ($object as $key => $value) 
    { 
      $new->$key = $value; 
    } 
    return $new; 
} 
$mySubclassObject = clone($myObject, 'mySubclass'); 

그것의 꽤하지, 그 certianly 나는 좋은 방법이라고 생각 것없는 것,하지만 재사용이며, 그것은 멋지다 : 변수는 공공, 당신은 다음과 같이 몇 가지 지저분한 물건을 할 수 있습니다 .

5

당신은이 질문에 진지하게 대답 할 것이지만 이냐고 묻는다면 약간의 흑 마법으로 할 수 있습니다. 그것은 당신의 디자인에 심각하게 잘못된 것이 있음을 시사합니다. 그럼에도 불구하고

:

function change_class($object, $new_class) { 
    preg_match('~^O:[0-9]+:"[^"]+":(.+)$~', serialize($object), $matches); 
    return unserialize(sprintf('O:%s:"%s":%s', strlen($new_class), $new_class, $matches[1])); 
} 

이 다른 개체 또는 리소스에 대한 참조가 손실되는 것을 의미 일반적으로 직렬화와 같은 제한이 적용됩니다.

+0

진지하게, 그것은 작동합니다. 하지만 어떻게?! – Alfa

관련 문제