Hướng dẫn php instantiate class with namespace - php tạo lớp với không gian tên

Một cách khác để đạt được kết quả tương tự nhưng với các đối số động là như sau. Vui lòng xem xét lớp dưới đây là lớp bạn muốn khởi tạo.

Và sau đó:

newInstanceArgs(['one', 'two']);

Nếu bạn không sử dụng phiên bản PHP gần đây, vui lòng sử dụng mã sau thay thế dòng cuối cùng của ví dụ trên:

$r = new ReflectionClass('Acme\Bundle\MyBundle\Test');
$r->newInstanceArgs(array('one', 'two'));

Mã sẽ tạo ra đầu ra sau:

string(3) "one"
string(3) "two"

Từ khóa sử dụng cho phép các nhà phát triển rút ngắn không gian tên. Không gian tên được tạo có thể bao gồm các chức năng khác nhau có thể được sử dụng trong các bộ điều khiển và các lớp khác nhau.

$class = 'Foo_Bar';
$object = new $class();

Nó rất nổi tiếng rằng bạn có thể lập tức một lớp PHP với tên động bằng cách sử dụng một biến:

$object = new Foo_Bar();

giống như

namespace App;
$object = new \Foo\Bar();

// this would try to instantiate App\Foo\Bar
//$object = new Foo\Bar();

Nhưng nếu bạn sử dụng một tên động, chuỗi không nên có dấu gạch chéo ngược hàng đầu vì dấu gạch chéo ngược không phải là một phần của tên lớp.

namespace App;
$class = 'Foo\Bar';
$object = new $class();

Nếu bạn bao gồm dấu gạch chéo, mã của bạn won đã chạy trên Php 5.3.2 - bạn sẽ gặp lỗi Class '\\Foo\\Bar' not found. Bài viết Stackoverflow này đặt thẳng cho tôi. Như đã đề cập trong bài đăng, mã sẽ hoạt động trong PHP> = 5.3.3 có hoặc không có dấu gạch chéo.

Mẹo này được đăng lại từ blog của tôi, jontai.me

(Php 5> = 5.3.0, Php 7, Php 8)

Trước khi thảo luận về việc sử dụng các không gian tên, điều quan trọng là phải hiểu làm thế nào PHP biết phần tử tên nào được yêu cầu. Một sự tương tự đơn giản có thể được thực hiện giữa các không gian tên PHP và hệ thống tập tin. Có ba cách để truy cập một tệp trong hệ thống tệp:

  1. Tên tệp tương đối như foo.txt. Điều này giải quyết cho
    newInstanceArgs(['one', 'two']);
    
    0 trong đó hiện tại là thư mục hiện đang bị chiếm. Vì vậy, nếu thư mục hiện tại là
    newInstanceArgs(['one', 'two']);
    
    1, tên được giải quyết thành
    newInstanceArgs(['one', 'two']);
    
    2.
  2. Tên đường dẫn tương đối như
    newInstanceArgs(['one', 'two']);
    
    3. Điều này giải quyết đến
    newInstanceArgs(['one', 'two']);
    
    4.
  3. Tên đường dẫn tuyệt đối như
    newInstanceArgs(['one', 'two']);
    
    5. Điều này giải quyết đến
    newInstanceArgs(['one', 'two']);
    
    5.

Nguyên tắc tương tự có thể được áp dụng cho các yếu tố đặt tên trong PHP. Ví dụ, một tên lớp có thể được đề cập theo ba cách:

  1. Tên không đủ tiêu chuẩn, hoặc một tên lớp không bị hủy bỏ như
    newInstanceArgs(['one', 'two']);
    
    7 hoặc
    newInstanceArgs(['one', 'two']);
    
    8. Nếu không gian tên hiện tại là
    newInstanceArgs(['one', 'two']);
    
    9, điều này sẽ giải quyết thành
    $r = new ReflectionClass('Acme\Bundle\MyBundle\Test');
    $r->newInstanceArgs(array('one', 'two'));
    
    0. Nếu mã là mã toàn cầu, không được ký tên, thì điều này sẽ giải quyết thành
    $r = new ReflectionClass('Acme\Bundle\MyBundle\Test');
    $r->newInstanceArgs(array('one', 'two'));
    
    1. Một cảnh báo: Tên không đủ tiêu chuẩn cho các hàm và hằng số sẽ giải quyết cho các chức năng và hằng số toàn cầu nếu hàm tên hoặc hằng số không được xác định. Xem bằng cách sử dụng không gian tên: dự phòng vào chức năng/hằng số toàn cầu để biết chi tiết.
    One caveat: unqualified names for functions and constants will resolve to global functions and constants if the namespaced function or constant is not defined. See Using namespaces: fallback to global function/constant for details.
  2. Tên đủ điều kiện hoặc tên lớp có tiền tố như
    $r = new ReflectionClass('Acme\Bundle\MyBundle\Test');
    $r->newInstanceArgs(array('one', 'two'));
    
    2 hoặc
    $r = new ReflectionClass('Acme\Bundle\MyBundle\Test');
    $r->newInstanceArgs(array('one', 'two'));
    
    3. Nếu không gian tên hiện tại là
    newInstanceArgs(['one', 'two']);
    
    9, điều này sẽ giải quyết thành
    $r = new ReflectionClass('Acme\Bundle\MyBundle\Test');
    $r->newInstanceArgs(array('one', 'two'));
    
    5. Nếu mã là mã toàn cầu, không được ký tên, thì điều này sẽ giải quyết thành
    $r = new ReflectionClass('Acme\Bundle\MyBundle\Test');
    $r->newInstanceArgs(array('one', 'two'));
    
    6.
  3. Tên đủ điều kiện hoặc tên tiền tố với toán tử tiền tố toàn cầu như
    $r = new ReflectionClass('Acme\Bundle\MyBundle\Test');
    $r->newInstanceArgs(array('one', 'two'));
    
    7 hoặc
    $r = new ReflectionClass('Acme\Bundle\MyBundle\Test');
    $r->newInstanceArgs(array('one', 'two'));
    
    8. Điều này luôn giải quyết cho tên theo nghĩa đen được chỉ định trong mã,
    $r = new ReflectionClass('Acme\Bundle\MyBundle\Test');
    $r->newInstanceArgs(array('one', 'two'));
    
    0.

Dưới đây là một ví dụ về ba loại cú pháp trong mã thực tế:

file1.php

string(3) "one"
string(3) "two"
0

string(3) "one"
string(3) "two"
1

string(3) "one"
string(3) "two"
2

file2.php

string(3) "one"
string(3) "two"
3

string(3) "one"
string(3) "two"
1

string(3) "one"
string(3) "two"
5

Lưu ý rằng để truy cập bất kỳ lớp toàn cầu, hàm hoặc hằng số, có thể sử dụng tên đủ điều kiện, chẳng hạn như \ strlen () hoặc \ Exception hoặc

string(3) "one"
string(3) "two"
6.\strlen() or \Exception or
string(3) "one"
string(3) "two"
6.

Ví dụ #1 truy cập các lớp, chức năng và hằng số toàn cầu từ trong không gian tên

string(3) "one"
string(3) "two"
7

string(3) "one"
string(3) "two"
8

string(3) "one"
string(3) "two"
9

Richard tại Richard-sumilang dot com

14 năm trước

$class = 'Foo_Bar';
$object = new $class();
0

$class = 'Foo_Bar';
$object = new $class();
1

$class = 'Foo_Bar';
$object = new $class();
2

$class = 'Foo_Bar';
$object = new $class();
3

$class = 'Foo_Bar';
$object = new $class();
4

Ẩn danh ¶

8 năm trước

$class = 'Foo_Bar';
$object = new $class();
5

$class = 'Foo_Bar';
$object = new $class();
6

$class = 'Foo_Bar';
$object = new $class();
7

Lukas Z

10 năm trước

$class = 'Foo_Bar';
$object = new $class();
8

$class = 'Foo_Bar';
$object = new $class();
9

$object = new Foo_Bar();
0

Tom tại Tomwardrop Dot Com ¶

10 năm trước

$object = new Foo_Bar();
1

$object = new Foo_Bar();
2

$object = new Foo_Bar();
3

$object = new Foo_Bar();
4

Philip Dot Preisser tại Arcor Dot de ¶

11 năm trước

$object = new Foo_Bar();
5

$object = new Foo_Bar();
6

$object = new Foo_Bar();
7

$object = new Foo_Bar();
8

Làm gì :: Lớp làm trong PHP?

Someclass :: class sẽ trả lại tên đủ điều kiện của someclass bao gồm cả không gian tên. Tính năng này đã được thực hiện trong Php 5.5. Nó rất hữu ích cho 2 lý do. Bạn có thể sử dụng từ khóa sử dụng để giải quyết lớp của mình và bạn không cần phải viết tên lớp đầy đủ.return the fully qualified name of SomeClass including the namespace. This feature was implemented in PHP 5.5. It's very useful for 2 reasons. You can use the use keyword to resolve your class and you don't need to write the full class name.

Không gian tên PHP hoạt động như thế nào?

Giống như C ++, không gian tên PHP là cách đóng gói các mục để có thể sử dụng lại cùng tên mà không có xung đột tên.Nó có thể được coi là một khái niệm trừu tượng ở nhiều nơi.Nó cho phép phân chia lại các chức năng/lớp/giao diện/hàm không đổi giống nhau trong không gian tên riêng mà không gặp lỗi nghiêm trọng.the way of encapsulating items so that same names can be reused without name conflicts. It can be seen as an abstract concept in many places. It allows redeclaring the same functions/classes/interfaces/constant functions in the separate namespace without getting the fatal error.

Sự khác biệt giữa sử dụng và bao gồm trong PHP là gì?

Sử dụng hàm bao gồm (), bao gồm một tệp PHP vào một tệp khác.Sau đó, bạn sẽ thấy hai tệp PHP được kết hợp thành một tệp HTML.... GFG.PHP ..

Sự khác biệt giữa không gian tên và sử dụng ở Laravel là gì?

Từ khóa sử dụng cho phép các nhà phát triển rút ngắn không gian tên.Không gian tên được tạo có thể bao gồm các chức năng khác nhau có thể được sử dụng trong các bộ điều khiển và các lớp khác nhau.. The namespace once created can include various functionalities which can be used in controllers and various classes.