>백엔드 개발 >PHP 튜토리얼 >상위 클래스 메서드에서 상위 클래스 메서드를 호출하는 하위 클래스 메서드의 이름을 얻으시겠습니까?

상위 클래스 메서드에서 상위 클래스 메서드를 호출하는 하위 클래스 메서드의 이름을 얻으시겠습니까?

WBOY
WBOY원래의
2016-08-04 09:21:581242검색

<code>class A{

    public $son_function;
    public function __construct() {
        
        $this->son_function = ? //这里获取到子类的方法名
    }
}

class B extends A{
    public function test() {
        
    }
    public function XML() {
        
    }
}

$b = new B();
$b->test();
echo $b->son_function;   //这里应该是test  
$b->XML();
echo $b->son_function;   //这里应该是XML </code>

설명: 예를 들어 인스턴스화 $b가 자체 test 메서드를 호출하는 경우 상위 클래스의 초기화 메서드 son_function$b에서 호출된 메서드의 이름을 저장합니다. 구현? 이 방법을 무엇이라고 하나요?

——————————————구분선————————————————
사용 시나리오를 추가하겠습니다: I 필요합니다 로그인한 사용자가 삭제 메소드를 사용할 때와 같이 로그인한 사용자의 모든 작업 단계와 데이터를 기록한 다음, 컨트롤러 이름과 메소드, 게시 및 수신된 데이터를 저장합니다. 지금은 이 기능 구현의 의미에 대해 이야기하지 않겠습니다. 제 생각은 각 컨트롤러가 공용 컨트롤러를 상속하고 공용 컨트롤러의 초기화 메서드에서 이 작업을 구현한다는 것입니다. 아래 그림과 비슷하게 의사 코드를 작성했습니다:
상위 클래스 메서드에서 상위 클래스 메서드를 호출하는 하위 클래스 메서드의 이름을 얻으시겠습니까?

답글 내용:

<code>class A{

    public $son_function;
    public function __construct() {
        
        $this->son_function = ? //这里获取到子类的方法名
    }
}

class B extends A{
    public function test() {
        
    }
    public function XML() {
        
    }
}

$b = new B();
$b->test();
echo $b->son_function;   //这里应该是test  
$b->XML();
echo $b->son_function;   //这里应该是XML </code>

설명: 예를 들어 인스턴스화 $b가 자체 test 메서드를 호출하는 경우 상위 클래스의 초기화 메서드 son_function$b에서 호출된 메서드의 이름을 저장합니다. 구현? 이 방법을 무엇이라고 하나요?

——————————————구분선————————————————
사용 시나리오를 추가하겠습니다: I 필요합니다 로그인한 사용자가 삭제 메소드를 사용할 때와 같이 로그인한 사용자의 모든 작업 단계와 데이터를 기록한 다음, 컨트롤러 이름과 메소드, 게시 및 수신된 데이터를 저장합니다. 지금은 이 기능 구현의 의미에 대해 이야기하지 않겠습니다. 제 생각은 각 컨트롤러가 공용 컨트롤러를 상속하고 공용 컨트롤러의 초기화 메서드에서 이 작업을 구현한다는 것입니다. 아래 그림과 비슷하게 의사 코드를 작성했습니다:
상위 클래스 메서드에서 상위 클래스 메서드를 호출하는 하위 클래스 메서드의 이름을 얻으시겠습니까?

  1. 이것은 객체지향 설계 철학에 어긋납니다. 상위 클래스는 하위 클래스의 구현에 신경쓰지 않아야 합니다.

  2. 명확하게 생각하고 정말로 하고 싶다면 성찰이 가능한 해결책입니다(그러나 비효율적입니다)

  3. 직관적으로 어댑터 패턴을 사용하는 것이 좋습니다.

어댑터 패턴:
https://en.wikipedia.org/wiki/Adapter_pattern
상위 클래스 메서드에서 상위 클래스 메서드를 호출하는 하위 클래스 메서드의 이름을 얻으시겠습니까?

더 적합한 구현 계획을 제공하기 위해 요구사항을 더욱 구체화해야 할 수도 있습니다

php late static 바인딩을 검색하면 문제를 해결할 수 있습니다

로직이 잘못되었습니다. 하위 클래스를 인스턴스화하지 않고 어떻게 테스트나 xml을 실행할 수 있습니까? 인스턴스화가 완료되었습니다. 생성자의 매개변수 변경이 여전히 의미가 있습니까?

<code>$b = new B();
$b->test();
$a = new A(); // <- 此时父类实例化根本不会受到子类影响,所以你的思路本身有问题</code>

게다가 공개 함수 test() {$this->sonFunction = 'test';}가 트릭을 수행합니다

PHP의 오버로드된 __call() 또는 __callstatic을 사용해 볼 수 있습니다

http://php.net/manual/zh/언어.oop5.overloading.php#object.callstatic

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.