2009-07-22 7 views
0

이것은 아마도 매우 직접적인 대답 일 것이지만 약간의 조언은 인정 될 것입니다.객체 지향 일반 메소드 : 인터페이스, 초록 또는 다른 것

내 모든 개체가 동일한 load() 및 loadMultiple() 메서드를 사용하는 작은 시스템이 있습니다. 각 코드가 정확히 동일합니다. 아주 간단한 예제입니다.

public static function load($id) { 
    // Instantiate the object 
    $object = new self($id); 
    return $object; 
} 

예제 위의 코드는 분명히 인터페이스에 갈 수 없어,하지만 난합니다 (loadMultiple 방법 동일) 객체를 인스턴스화하고로도 그것은 추상 클래스에 갈 수 있습니다.

가장 좋은 해결책은 무엇입니까? 현재 다음과 같은 상위 클래스를 만들 계획입니다.

class Object_Model { 
    public function load() { 
     // Code here 
    } 
    public function loadMultiple() { 
     // Code here 
    } 
} 

class Object1 extends Object_Model { 
} 

class Object2 extends Object_Model { 
} 

하지만 더 좋은 방법이 있어야합니다. 거기 있니? 클래스의 이름을 인스턴스화하고 해당 ID :

function load($class, $id) { 
    return new $class($id); 
} 

그건 현재의 코드가 정적 방법을 사용하기 때문에

답변

0

Ionut에 동의합니다. 기존의 공장 방식으로 진행합니다.

<?php 
abstract class A 
{ 
    protected $id; 

    protected function __construct($id) 
    { 
    $this->id = $id; 
    } 

    final public static function factory($subclass, $id) 
    { 
    // Instantiate the object 
    if (is_subclass_of($subclass, __CLASS__)) 
    { 
     return new $subclass($id); 
    } 
    throw new Exception("$subclass is not a valid class for this factory."); 
    } 
} 

class B extends A{} 
class C extends A{} 
class D{} 

try { 
    $b = A::factory('B', 1); 
    $c = A::factory('C', 2); 
    $d = A::factory('D', 2); 
} 
catch (Exception $e) 
{ 
    echo "Oops! " . $e->getMessage(); 
} 

당신은 late static binding으로 뭔가를 할 수있을 수도 있지만 그 경우에만

+0

감사했다. 후기 정적 바인딩이 완벽 해 보입니다. 그러나 우리 서버가 지원할 것이라고는 생각하지 않습니다. 나는 당신과 Ionut이 말하는 것을 이해합니다.하지만 제가 우아함에 가까울 때 거꾸로 한 것처럼 보입니다. 5.3. – PJE

0

, 나는 2 개 개의 인수를 취하는 기능을 가지고 잘 될 것이라고 생각 함수를 사용하여 팩토리를 구현하려면 확인을 누릅니다. 또는 함수에서 추출 할 수없는 논리가 더 있습니까?

0

PHP 5.3을 사용하는 경우 부모 클래스와 새로운 static 키워드를 사용하여 정적 함수가 호출 된 하위 클래스를 확인할 수 있습니다.

그러나 __construct 메서드에서 모든 설정 작업을 수행하는 동안 최선의 방법은 시도하고 참된 new Object1($id); 메서드를 사용하는 것입니다. 코드를 읽고 유지하는 것이 조금 쉬울 것입니다.

여러 개의로드 예제를 사용하면 프로세스를 신속하게 처리하기 위해 별도의 함수로 추상화 할 수 있습니다.

+0

죄송합니다 dcousineau PHP 5.3의 - 베드로가 조금 더 나은 LSB 설명 그래서 베드로 그에게 대답 – PJE