2010-05-02 44 views
10

từ sự hiểu biết của tôi, yêu cầu mã bột nhão vào tệp php gọi.php yêu cầu gọi lớp từ bên trong phương pháp

nếu bạn yêu cầu từ bên trong phương thức ... nó sẽ dán toàn bộ mã/lớp bên trong phương thức, chặn câu lệnh tiếp theo trong phương thức.

ví dụ:

function test() { 

    require 'pathtosomeclasscode'; 
    somestatement; // any code after the require is blocked. 

} 

làm cách nào để giải quyết vấn đề này, để có thể yêu cầu mã ở nơi nào, mà không cần dán ở vị trí chính xác đó?

+0

Tại sao nó chặn câu lệnh tiếp theo? – zneak

+0

nó sẽ đặt tất cả các mã ra khỏi hình dạng, ví dụ như. lớp được dán bên trong hàm –

+1

@jera: Đó không phải là điều xảy ra. Tôi đã nói điều này trong câu trả lời của tôi, nhưng tôi sẽ củng cố nó ở đây: là có một lỗi/sự cố bạn đang gặp phải làm cho bạn tin rằng đây là trường hợp? Nếu có, vui lòng cung cấp cho chúng tôi thêm chi tiết để chúng tôi có thể khắc phục nguồn gốc của sự cố. – icio

Trả lời

17

Hơi ngạc nhiên, điều này dường như chỉ hoạt động tốt. Mã được bao gồm sẽ thực hiện bên trong phạm vi của Baz :: bork() - nhưng mã đơn giản định nghĩa một lớp và các lớp là toàn cầu. Vì vậy, bạn kết thúc với một lớp học được xác định.

File: Foo.php:

<?PHP 
class Foo{ 
     function bar(){ 
       echo "Hello from Foo::bar()!\n"; 
     } 
} 

File: Baz.php:

<?PHP 
class Baz{ 

     function bork(){ 
       require_once "Foo.php"; 
       $f = new Foo(); 
      $f->bar(); 
     } 
} 

echo "testing internal definition:\n"; 
$b = new Baz(); 
$b->bork(); 

echo "\ntesting in global scope:\n"; 

$f = new Foo(); 
$f->bar(); 
echo "\nall done\n"; 

Output:

$ php Baz.php 
testing internal definition: 
Hello from Foo::bar()! 

testing in global scope: 
Hello from Foo::bar()! 

all done 

Bây giờ, tôi không thể nghĩ ra nhiều nơi bạn muốn làm mọi thứ theo cách này. Mọi người thường require_once() bất kỳ phụ thuộc có thể nào ở đầu tệp lớp của họ, bên ngoài định nghĩa lớp.

+0

Điều này có thể hữu ích khi tệp được yêu cầu biến: 'require_once $ dirName. "/../{$ fileName} .php"; ' –

+0

Điều gì sẽ xảy ra nếu tệp cũng chỉ định một không gian tên, nó sẽ xử lý đúng không? Vâng, nó đã hoạt động. – SiXoS

+0

@JamesPoulson Điều này cũng hữu ích cho việc tải có điều kiện/trì hoãn mã. Ví dụ. một plugin wordpress có thể có mã chỉ được sử dụng trên giao diện người dùng/backend/ajax/trang cụ thể, v.v. Vì plugin tải trước khi biết trang/bài đăng bạn đang truy cập, bạn cần phải trì hoãn việc tải trong wp được thực hiện với hành động, mà sẽ gọi có, một chức năng ... Điều này có thể tăng tốc độ những thứ lên phía máy chủ, nhưng cũng tránh tải các phong cách không cần thiết và các kịch bản giảm yêu cầu không cần thiết ... – nus

1

thử require_once? Chỉ cần đưa bạn vào đó ở nơi khác.

0

Nếu bạn sử dụng include_once ('script.php'), bạn sẽ không gặp phải lỗi về các lớp được redeclared.

tôi đã không thử những điều sau đây bản thân mình, nhưng tôi đang nghĩ đến việc thiết lập này cũng có thể có tác dụng nếu bạn không muốn include_once() dư thừa:

class Whatever { 

    protected $classObject; 
    public function __construct(/*...*/) { 
     include('anotherClass.php'); 
     $this->classObject = new anotherClass(); 
    } 

    public function someFunction(/*...*/) { 
     $this->classObject->classObjectFunction(); 
    } 

    public function anotherFunction(/*...*/) { 
     $this->classObject->classObjectFunction(); 
    } 
} 

Sau đó, bạn có thể gọi đoạn mã sau đó mỗi người sẽ gọi một chức năng trong cùng một đối tượng lớp chia sẻ:

$Whatever = new Whatever(); 
$Whatever->someFunction(); 
$Whatever->anotherFunction(); 
5

Calling require, require_once, include hoặc include_oncesẽ không dừng việc thực thi mã trong hàm của bạn trừ khi có sự cố với tập lệnh được bao gồm. Mã trong tệp được bao gồm được thực thi trong cùng một phạm vi làm hàm (với các hàm và lớp được định nghĩa là toàn cầu), không được chèn vào nó, thay thế những gì khác ở đó.

Các câu trả lời khác khuyên bạn nên sử dụng một trong các giải pháp thay thế để require làm giải pháp - các giải pháp này có thể phù hợp với bạn nếu lỗi trong tập lệnh của bạn gây ra xung đột khi đặt tên (nghĩa là cố gắng xác định lại lớp hoặc chức năng) , nếu không bạn có thể muốn cho chúng tôi biết thêm chi tiết về những gì đã xảy ra (hoặc không xảy ra) để khiến bạn nghĩ rằng có vấn đề để chúng tôi có thể giúp bạn giải quyết nguyên nhân thực sự.

Lưu ý thêm, các phương pháp bao gồm tệp này không dán mã vào tập lệnh của bạn. Dán là công cụ mà mọi người sử dụng để duy trì văn bản. Tôi đề nghị bạn nên đọc hướng dẫn PHP để cố gắng và tiếp tục sự hiểu biết của bạn về cách các chức năng hoạt động:

bài viết một lần nữa nếu bạn' đã có thêm câu hỏi về công việc của họ sau khi nhìn vào chúng.

0

Tôi nghĩ điều bạn đang nói là bạn không muốn mã thực thi ngay lập tức. Nếu điều đó đúng, bạn có một số tùy chọn:

  1. Bạn có thể di chuyển yêu cầu.

  2. Bạn cũng có thể đọc tệp bằng fopen(), sau đó phân tích cú pháp. (Bạn không thể gọi eval vì nó sẽ không hiểu HTML, nhưng bạn có thể làm điều đó với một trình phân tích cú pháp)

0

Như tôi thấy, bạn đang sử dụng các tệp bên ngoài để tải lớp học, tôi có đúng không? Tại sao bạn không sử dụng Autoloading Classes. Tôi biết nó sẽ không hoạt động khi bạn muốn tải các cơ quan lớp khác nhau trong các hoàn cảnh khác nhau, nhưng tôi thực sự không biết đó có phải là một thực hành tốt hay không.

Các vấn đề liên quan