Mảng để đối số php

Đó là một cuộc gọi gần, nhưng đối số được đặt tên — còn được gọi là tham số được đặt tên — được hỗ trợ trong PHP 8. Trong bài đăng này, tôi sẽ thảo luận về thông tin chi tiết của chúng, nhưng trước tiên hãy để tôi cho bạn thấy chúng trông như thế nào với một vài ví dụ trong tự nhiên

setcookie(
    name: 'test',
    expires: time() + 60 * 60 * 2,
);

Đối số được đặt tên được sử dụng trên hàm PHP tích hợp

class CustomerData
{
    public function __construct(
        public string $name,
        public string $email,
        public int $age,
    ) {}
}

$data = new CustomerData(
    name: $input['name'],
    email: $input['email'],
    age: $input['age'],
);

Một DTO sử dụng các thuộc tính được quảng cáo, cũng như các đối số được đặt tên

$data = new CustomerData(...$customerRequest->validated());

Các đối số được đặt tên cũng hỗ trợ trải rộng mảng

Bạn có thể đoán nó từ các ví dụ. các đối số được đặt tên cho phép bạn chuyển dữ liệu đầu vào vào một hàm, dựa trên tên đối số của chúng thay vì thứ tự đối số

Tôi cho rằng các đối số được đặt tên là một tính năng tuyệt vời sẽ có tác động đáng kể đến cuộc sống lập trình hàng ngày của tôi. Có lẽ bạn đang tự hỏi về các chi tiết mặc dù. Nếu bạn nhập sai tên, cú pháp trải rộng mảng đó sẽ ra sao?

Đây là nơi quảng cáo sẽ đến. Tuy nhiên, thay vào đó, tôi muốn hướng bạn tới trang Nhà tài trợ GitHub của tôi. Nếu bạn là độc giả thường xuyên và nội dung của tôi đang giúp ích cho bạn, bạn có thể xem xét tài trợ một lần hoặc hàng tháng. Nếu bạn là một công ty đang tìm kiếm các vị trí đặt quảng cáo chuyên dụng trên blog này hoặc bản tin của tôi, bạn có thể gửi email cho tôi theo địa chỉ brendt@stitcher. io

Tại sao các đối số được đặt tên?

Giả sử tính năng này là một tính năng gây tranh cãi nhiều và có một số lập luận phản đối việc không thêm chúng. Tuy nhiên, tôi muốn nói rằng lợi ích của chúng vượt xa nỗi sợ về các vấn đề tương thích ngược hoặc API cồng kềnh. Theo cách tôi thấy, chúng sẽ cho phép chúng tôi viết mã sạch hơn và linh hoạt hơn

Thứ nhất, các đối số được đặt tên cho phép bạn bỏ qua các giá trị mặc định. Hãy xem lại ví dụ về cookie

setcookie(
    name: 'test',
    expires: time() + 60 * 60 * 2,
);

Chữ ký phương thức của nó thực sự là như sau

setcookie ( 
    string $name, 
    string $value = "", 
    int $expires = 0, 
    string $path = "", 
    string $domain = "", 
    bool $secure = false, 
    bool $httponly = false,
) : bool

Trong ví dụ tôi đã trình bày, chúng tôi không cần đặt cookie

class CustomerData
{
    public function __construct(
        public string $name,
        public string $email,
        public int $age,
    ) {}
}

$data = new CustomerData(
    name: $input['name'],
    email: $input['email'],
    age: $input['age'],
);
9, nhưng chúng tôi cần đặt thời gian hết hạn. Các đối số được đặt tên làm cho phương thức này gọi ngắn gọn hơn một chút

setcookie(
    'test',
    '',
    time() + 60 * 60 * 2,
);

$data = new CustomerData(...$customerRequest->validated());
0 không có đối số được đặt tên

setcookie(
    name: 'test',
    expires: time() + 60 * 60 * 2,
);

$data = new CustomerData(...$customerRequest->validated());
0 với các đối số được đặt tên

Bên cạnh việc bỏ qua các đối số có giá trị mặc định, còn có lợi ích là có sự rõ ràng về biến nào làm gì; . Bây giờ chúng ta có thể nói rằng rất nhiều đối số thường có mùi mã;

Nhận thấy một tpyo? . Nếu bạn muốn cập nhật những gì đang diễn ra trên blog này, bạn có thể theo dõi tôi trên Twitter hoặc đăng ký nhận bản tin của tôi. Đăng ký email

Đối số được đặt tên theo chiều sâu

Với những kiến ​​thức cơ bản đã sẵn sàng, chúng ta hãy xem những đối số được đặt tên có thể và không thể làm gì

Trước hết, các đối số được đặt tên có thể được kết hợp với các đối số không được đặt tên — còn được gọi là có thứ tự —. Trong trường hợp đó, các đối số được sắp xếp phải luôn đến trước

Lấy ví dụ DTO của chúng tôi từ trước

class CustomerData
{
    public function __construct(
        public string $name,
        public string $email,
        public int $age,
    ) {}
}

Bạn có thể xây dựng nó như vậy

$data = new CustomerData(
    $input['name'],
    age: $input['age'],
    email: $input['email'],
);

Tuy nhiên, có một đối số được sắp xếp sau một đối số được đặt tên sẽ gây ra lỗi

$data = new CustomerData(
    age: $input['age'],
    $input['name'],
    email: $input['email'],
);

Tiếp theo, có thể sử dụng trải rộng mảng kết hợp với các đối số được đặt tên

class CustomerData
{
    public function __construct(
        public string $name,
        public string $email,
        public int $age,
    ) {}
}

$data = new CustomerData(
    name: $input['name'],
    email: $input['email'],
    age: $input['age'],
);
0

Tuy nhiên, nếu thiếu các mục bắt buộc trong mảng hoặc nếu có một khóa không được liệt kê dưới dạng đối số được đặt tên, thì sẽ xảy ra lỗi

class CustomerData
{
    public function __construct(
        public string $name,
        public string $email,
        public int $age,
    ) {}
}

$data = new CustomerData(
    name: $input['name'],
    email: $input['email'],
    age: $input['age'],
);
1

Có thể kết hợp các đối số có tên và có thứ tự trong một mảng đầu vào, nhưng chỉ khi các đối số có thứ tự tuân theo cùng một quy tắc như trước. họ phải đến trước

class CustomerData
{
    public function __construct(
        public string $name,
        public string $email,
        public int $age,
    ) {}
}

$data = new CustomerData(
    name: $input['name'],
    email: $input['email'],
    age: $input['age'],
);
2

Mảng để đối số php

Sự phát triển của NULL trong PHP


Nếu bạn đang sử dụng các hàm biến đổi, các đối số được đặt tên sẽ được chuyển cùng với tên khóa của chúng vào mảng đối số biến đổi. Lấy ví dụ sau

class CustomerData
{
    public function __construct(
        public string $name,
        public string $email,
        public int $age,
    ) {}
}

$data = new CustomerData(
    name: $input['name'],
    email: $input['email'],
    age: $input['age'],
);
3

Trong trường hợp này,

$data = new CustomerData(...$customerRequest->validated());
2 trong
$data = new CustomerData(...$customerRequest->validated());
3 sẽ chứa dữ liệu sau

class CustomerData
{
    public function __construct(
        public string $name,
        public string $email,
        public int $age,
    ) {}
}

$data = new CustomerData(
    name: $input['name'],
    email: $input['email'],
    age: $input['age'],
);
4

Thuộc tính — còn được gọi là chú thích — cũng hỗ trợ các đối số được đặt tên

class CustomerData
{
    public function __construct(
        public string $name,
        public string $email,
        public int $age,
    ) {}
}

$data = new CustomerData(
    name: $input['name'],
    email: $input['email'],
    age: $input['age'],
);
5

Không thể có một biến làm tên đối số

class CustomerData
{
    public function __construct(
        public string $name,
        public string $email,
        public int $age,
    ) {}
}

$data = new CustomerData(
    name: $input['name'],
    email: $input['email'],
    age: $input['age'],
);
6

Và cuối cùng, các đối số được đặt tên sẽ giải quyết một cách thực tế với các thay đổi tên trong quá trình kế thừa. Lấy ví dụ này

class CustomerData
{
    public function __construct(
        public string $name,
        public string $email,
        public int $age,
    ) {}
}

$data = new CustomerData(
    name: $input['name'],
    email: $input['email'],
    age: $input['age'],
);
7

PHP sẽ âm thầm cho phép thay đổi tên của

$data = new CustomerData(...$customerRequest->validated());
4 thành
$data = new CustomerData(...$customerRequest->validated());
5 và
$data = new CustomerData(...$customerRequest->validated());
6 thành
$data = new CustomerData(...$customerRequest->validated());
7;

class CustomerData
{
    public function __construct(
        public string $name,
        public string $email,
        public int $age,
    ) {}
}

$data = new CustomerData(
    name: $input['name'],
    email: $input['email'],
    age: $input['age'],
);
8

Lỗi thời gian chạy trong trường hợp

$data = new CustomerData(...$customerRequest->validated());
8 là một phiên bản của
$data = new CustomerData(...$customerRequest->validated());
9

Cách tiếp cận thực tế này đã được chọn để ngăn chặn sự thay đổi lớn khi tất cả các đối số kế thừa sẽ phải giữ nguyên tên. Có vẻ như là một giải pháp tốt cho tôi


Đó là hầu hết để nói về các đối số được đặt tên. Nếu bạn muốn biết thêm một chút cốt truyện đằng sau một số quyết định thiết kế, tôi khuyên bạn nên đọc RFC

Làm cách nào để chuyển mảng làm đối số trong PHP?

Bạn có thể truyền một mảng làm đối số . Nó được sao chép theo giá trị (hoặc COW'd, về cơ bản có nghĩa giống với bạn), vì vậy bạn có thể array_pop() (và tương tự) tất cả những gì bạn thích trên đó và sẽ không ảnh hưởng đến bất kỳ thứ gì bên ngoài. hàm sendemail($id, $userid){ //. } sendemail(mảng('a', 'b', 'c'), 10);

Khi bạn chuyển một mảng làm đối số cho a?

Trong trường hợp, khi một mảng (biến) được truyền dưới dạng đối số của hàm, thì nó sẽ truyền địa chỉ cơ sở của mảng . Địa chỉ cơ sở là vị trí của phần tử đầu tiên của mảng trong bộ nhớ.