2011-11-26 44 views
13

i có mã oop php:get mẹ mở rộng lớp trong php

class a { 
    // with properties and functions 
} 

class b extends a { 
    public function test() { 
     echo __CLASS__; // this is b 
     // parent::__CLASS__ // error 
    } 
} 

$b = new b(); 
$b->test(); 

Tôi có một tầng lớp phụ huynh ít (bình thường và trừu tượng) và nhiều lớp con. Các lớp con mở rộng các lớp cha. Vì vậy, khi tôi khởi tạo đứa trẻ tại một số điểm tôi cần phải tìm ra những gì cha mẹ tôi gọi.

ví dụ như chức năng b::test() sẽ trở lại a

Làm thế nào tôi có thể nhận được (từ mã của tôi) lớp a từ lớp học của tôi b?

nhờ

+4

đọc: http://stackoverflow.com/questions/506705/php-get-classname-from-static-call-in-extended-class –

Trả lời

16

Mã của bạn đề xuất bạn đã sử dụng parent, thực tế là những gì bạn cần. Vấn đề nằm ở biến số __CLASS__ ma thuật.

Các documentation trạng thái:

Tính đến PHP 5 liên tục lợi nhuận này tên lớp như nó đã được công bố.

Đó là những gì chúng ta cần, nhưng như đã nêu trong this comment trên php.net:

claude lưu ý rằng __CLASS__ luôn chứa lớp mà nó được gọi trong, nếu bạn thà có lớp mà được gọi là phương thức sử dụng get_class ($ this) để thay thế. Tuy nhiên, điều này chỉ hoạt động với các trường hợp, không phải khi được gọi là tĩnh.

Nếu bạn chỉ cần lớp cha, có chức năng cho điều đó. một trong đó là gọi get_parent_class

15

Bạn có thể sử dụng get_parent_class:

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

$b = new B; 
$b->test(); // A 

này cũng sẽ có tác dụng nếu B::test là tĩnh.

LƯU Ý: Có sự khác biệt nhỏ giữa việc sử dụng get_parent_class không có đối số so với chuyển đối số $this làm đối số. Nếu chúng tôi mở rộng ví dụ trên với:

class C extends B {} 

$c = new C; 
$c->test(); // A 

Chúng tôi nhận được A làm lớp cha (lớp cha mẹ của B, nơi phương thức được gọi). Nếu bạn luôn muốn cha mẹ gần nhất cho đối tượng bạn đang thử nghiệm, bạn nên sử dụng get_parent_class($this) để thay thế.

10

Bạn có thể sử dụng phản ánh để làm điều đó:

Thay vì

parent::__CLASS__; 

sử dụng

$ref = new ReflectionClass($this); 
echo $ref->getParentClass()->getName(); 
11
class a { 
    // with propertie and functions 
} 

class b extends a { 

    public function test() { 
     echo get_parent_class($this); 
    } 
} 


$b = new b(); 
$b->test(); 
6

Sử dụng class_parents để thay thế. Nó sẽ cung cấp cho một loạt các bậc cha mẹ.

<?php 
class A {} 
class B extends A { 
} 
class C extends B { 
    public function test() { 
     echo implode(class_parents(__CLASS__),' -> '); 
    } 
} 

$c = new C; 
$c->test(); // B -> A 
Các vấn đề liên quan