<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 필요합니다 로그인한 사용자가 삭제 메소드를 사용할 때와 같이 로그인한 사용자의 모든 작업 단계와 데이터를 기록한 다음, 컨트롤러 이름과 메소드, 게시 및 수신된 데이터를 저장합니다. 지금은 이 기능 구현의 의미에 대해 이야기하지 않겠습니다. 제 생각은 각 컨트롤러가 공용 컨트롤러를 상속하고 공용 컨트롤러의 초기화 메서드에서 이 작업을 구현한다는 것입니다. 아래 그림과 비슷하게 의사 코드를 작성했습니다:
이것은 객체지향 설계 철학에 어긋납니다. 상위 클래스는 하위 클래스의 구현에 신경쓰지 않아야 합니다.
명확하게 생각하고 정말로 하고 싶다면 성찰이 가능한 해결책입니다(그러나 비효율적입니다)
직관적으로 어댑터 패턴을 사용하는 것이 좋습니다.
어댑터 패턴:
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