2010-07-07 5 views
1
다음

가 제공하는 간단한 PHP 코드간단한 수준의 추상화 (이름을 충돌?) 작동하지 않습니다

<? 
abstract class A{ 
abstract public function a($x); 
} 
class B extends A{ 
public function a($x) 
{ 
echo $x; 
} 
} 

$q = new B; 
$q->a(10); 
?> 

입니다 : PHP 치명적인 오류 : A()

추상 메소드 A를 :: 호출 할 수 없습니다

하지만 함수의 이름을 "a"가 아닌 다른 것으로 변경하면됩니다.

그래서 (10)을 호출하면 실제로 어떤 일이 발생합니까? 여기에 논리가 표시되지 않습니다.

답변

3

당신은 꽤 명백한 문제가 있습니다. __construct() 메소드가 없기 때문에 abstract public function a();이 생성자 (php 4)입니다. B 클래스의 인스턴스에서 a() 메서드를 호출 할 때가 아니라 B ​​클래스를 인스턴스화 할 때 치명적인 오류가 발생합니다.

a() 메서드의 이름을 다른 것으로 변경하면 모두 의도 한대로 작동합니다! 작동

예 :

<?php 
abstract class A 
{ 
    abstract public function test($x); 
} 

class B extends A 
{ 
    public function test($x) 
    { 
     echo $x; 
    } 
} 

$q = new B(); 
$q->test(10); 
?> 
+1

대안이 A''에'__construct'를 추가하는 것입니다. – Artefacto

+0

물론 :) +1 –

+0

@Artefacto는 '엄격한 표준 : 클래스 A에 대해 이미 정의 된 생성자를 다시 정의합니다.'를 트리거합니다. 최소한 함수'a()'를 유지한다면. 이전 버전과의 호환성이 실제로 다른 것보다 버그에 더 가깝습니다. – Gordon

관련 문제