abstract class A
{
abstract public function foo();
}
class B extends A
{
public function foo() {
echo 'foo~';
}
}
$b = new B();
bar($b);
function bar(A $a) {
$a->foo();
}
function bar()
의 인자 타입으로 class A
가 들어갔다는 것이다.foo()
method가 구현이 되어있을 것이기 때문에 저런식으로 많이 쓴다.abstract class A
{
abstract public function foo();
}
class B extends A
{
public function foo() {
echo "foo~ B\n";
}
}
class C extends A
{
public function foo() {
echo "foo~ C\n";
}
}
$b = new B();
bar($b);
$c = new C();
bar($c);
function bar(A $a) {
$a->foo();
}
foo~ B
와 foo~ C
가 출력된다.implements
라는 키워드를 사용.extends
키워드를 사용.interface A
{
public function foo();
}
class B implements A
{
public function foo() {
echo 'foo~~';
}
}
B::foo();
위 코드의 결과로 foo~~
가 출력된다.
근데 별개로 주의해야할게 하나 있다. 현재 foo() method를 B::foo()
로 instance(object)를 생성하지 않고 함수를 불렀는데, foo() method에서 인스턴스 데이터에 접근하지 않기 때문에 에러가 안 난 것이다.
foo() method를 아래와 같이 구현할 경우에는 에러가 난다.
interface A
{
public function foo();
}
class B implements A
{
public $msg = 'hi!';
public function foo() {
echo 'foo~~' . $this->msg;
}
}
B::foo(); // error!!
Uncaught Error: Using $this when not in object context
$this
키워드를 사용하지 않아야 한다.use
키워드를 통하여 상속받는다. (trait를 trait가 상속받을 수도 있고 class가 상속받을 수도 있음. 둘 다 use 키워드 이용.)trait T1
{
private $t1 = 't1~';
protected function foo() {
echo $this->t1;
}
}
trait T2
{
private $t2 = 't2~';
protected function bar() {
echo $this->t2;
}
}
class A
{
use T1, T2;
public function foobar() {
$this->foo();
$this->bar();
}
}
$a = new A();
$a->foobar();
t1~
과 t2~
가 출력된다.trait T1
{
private $t1 = 't1~';
protected function foo() {
echo $this->t1;
}
}
trait T2
{
private $t2 = 't2~';
protected function bar() {
echo $this->t2;
}
}
trait T
{
use T1, T2;
abstract public function foobar();
}
class A
{
use T;
public function foobar() {
$this->foo();
$this->bar();
}
}
$a = new A();
$a->foobar();
t1~
과 t2~
가 출력된다.trait T1
{
protected function foo() {
echo __TRAIT__;
}
}
trait T2
{
protected function foo() {
echo __TRAIT__;
}
}
class A
{
use T1, T2 {
T1::foo insteadof T2;
}
public function foobar() {
$this->foo();
}
}
$a = new A();
$a->foobar();
insteadof
키워드로 충돌을 제어할 수 있다.T1
이 출력된다.T1::foo insteadof T2;
→ T2::foo insteadof T1;
로 바꾸면 T2
가 출력된다.
잘 보고 있습니다. 감사합니다.