2011-08-11 39 views
16

Tôi đang cố gắng thêm phương thức động từ các tệp bên ngoài. Ngay bây giờ tôi có phương pháp __call trong lớp của tôi vì vậy khi tôi gọi phương thức tôi muốn, __call bao gồm nó cho tôi; vấn đề là tôi muốn gọi hàm nạp bằng cách sử dụng lớp của tôi, và tôi không muốn hàm nạp bên ngoài lớp;Cách thêm phương thức động

Class myClass 
{ 
    function__call($name, $args) 
    { 
     require_once($name.".php"); 
    } 
} 

echoA.php:

function echoA() 
{ 
    echo("A"); 
} 

sau đó tôi muốn sử dụng nó như:

$myClass = new myClass(); 
$myClass->echoA(); 

Bất cứ lời khuyên sẽ được đánh giá cao.

+0

Từ php [manual] (http://www.php.net/manual/functions.user-defined.php): * "... Tất cả các hàm và lớp trong PHP đều có phạm vi toàn cục. .. "*. Vì vậy, ít nhất: * "... và tôi không muốn chức năng nạp bên ngoài lớp học, ..." * sẽ không thể. – Yoshi

+0

Điều này nghe như một ý tưởng tồi ... – deceze

+0

@Yoshi tôi nghĩ rằng tôi đã không giải thích tốt, khi tôi bao gồm các tập tin có chứa các chức năng, nó có thể được gọi là bất cứ nơi nào, như: echoA(); thay vì $ myClass-> echoA(); –

Trả lời

0

Những gì bạn đang đề cập đến được gọi là Quá tải. Đọc tất cả về nó trong PHP Manual

2

nếu tôi đọc hướng dẫn đúng, __call được gọi insted của hàm, nếu chức năng Dosn't tồn tại vì vậy bạn probely cần phải gọi nó là sau khi bạn tạo ra nó

Class myClass 
{ 
    function __call($name, $args) 
    { 
     require_once($name.".php"); 
     $this->$name($args); 
    } 
} 
+2

Bạn không thể thêm phương thức vào các lớp php trong khi thực thi. – Yoshi

+0

Tôi đã thử cách đây 2 giờ, chúng tôi không thể thêm phương thức bằng cách bao gồm một tệp chứa hàm (s), đó là lý do tôi hỏi câu hỏi này;) –

+0

Tôi nghĩ đây có thể là câu trả lời hợp lệ, ngoài cách require_once để gọi hàm động dường như không phải là cách để đi. Tôi đang tạo ra một phương pháp trên bay có điều kiện bằng cách sử dụng phương pháp ma thuật __call. –

12

Bạn không thể tự động thêm các phương pháp để một lớp học trong thời gian chạy, thời gian. *
PHP đơn giản không phải là một rất duck-punchable ngôn ngữ.

* Không có ugly hacks.

-3

Tôi đã làm việc lên ví dụ mã sau và phương thức trợ giúp hoạt động với __call có thể hữu ích. https://github.com/permanenttourist/helpers/tree/master/PHP/php_append_methods

+3

Lưu ý rằng [câu trả lời chỉ có liên kết] (http://meta.stackoverflow.com/tags/link-only-answers/info) không được khuyến khích, các câu trả lời SO phải là điểm cuối của việc tìm kiếm giải pháp (so với nhưng một điểm dừng khác của tài liệu tham khảo, mà có xu hướng để có được cũ theo thời gian). Vui lòng xem xét thêm bản tóm tắt độc lập tại đây, giữ liên kết dưới dạng tham chiếu. – kleopatra

+0

Liên kết đang ngoại tuyến. – mheinzerling

2

Bạn có thể tự động thêm thuộc tính và phương thức cung cấp nó thông qua hàm tạo theo cùng cách bạn có thể chuyển một hàm làm đối số của hàm khác.

class Example { 
    function __construct($f) 
    { 
     $this->action=$f; 
    } 
} 

function fun() { 
    echo "hello\n"; 
} 

$ex1 = new class('fun'); 

Bạn không thể gọi directlry $ex1->action(), nó phải được gán cho một biến và sau đó bạn có thể gọi biến này như một hàm.

+0

Vui lòng đăng một phần thiết yếu tại đây – VladL

0

Bạn có thể tạo một thuộc tính trong lớp học của bạn: methods=[]
và sử dụng create_function cho tạo chức năng lambda.
Cổ phiếu trong thuộc tính methods, tại chỉ mục tên của phương thức bạn muốn.
sử dụng:

function __call($method, $arguments) 
{ 
    if(method_exists($this, $method)) 
     $this->$method($arguments); 
    else 
     $this->methods[$method]($arguments); 
} 

để tìm và gọi phương pháp tốt.

1

Đây có phải là những gì bạn cần không?

$methodOne = function() 
{ 
    echo "I am doing one.".PHP_EOL; 
}; 

$methodTwo = function() 
{ 
    echo "I am doing two.".PHP_EOL; 
}; 

class Composite 
{ 
    function addMethod($name, $method) 
    { 
     $this->{$name} = $method; 
    } 

    public function __call($name, $arguments) 
    { 
     return call_user_func($this->{$name}, $arguments); 
    } 
} 


$one = new Composite(); 
$one -> addMethod("method1", $methodOne); 
$one -> method1(); 
$one -> addMethod("method2", $methodTwo); 
$one -> method2(); 
Các vấn đề liên quan