2010-10-27 40 views
5

Tôi biết nó có thể sử dụng đối số tùy chọn như sau:Tham số tùy chọn PHP - chỉ định giá trị tham số theo tên?

function doSomething($do, $something = "something") { 

} 

doSomething("do"); 
doSomething("do", "nothing"); 

Nhưng giả sử bạn có các tình huống sau đây:

function doSomething($do, $something = "something", $or = "or", $nothing = "nothing") { 

} 

doSomething("do", $or=>"and", $nothing=>"something"); 

Vì vậy, trong những dòng trên nó sẽ mặc định $something để "cái gì đó", mặc dù tôi đang đặt giá trị cho mọi thứ khác. Tôi biết điều này là có thể trong .net - Tôi sử dụng nó tất cả các thời gian. Nhưng tôi cần phải làm điều này trong PHP nếu có thể.

Bất cứ ai có thể cho tôi biết nếu điều này là có thể? Tôi đang thay đổi chương trình Omnistar Affiliate mà tôi đã tích hợp vào Interspire Shopping Cart - vì vậy tôi muốn giữ một chức năng hoạt động bình thường đối với bất kỳ nơi nào mà tôi không thay đổi cuộc gọi đến chức năng, nhưng ở một nơi (mà tôi đang mở rộng) muốn chỉ định tham số bổ sung. Tôi không muốn tạo ra một chức năng khác trừ khi tôi hoàn toàn phải làm vậy.

+1

+1 đến @sanmai; cũng lưu ý rằng Perl, Python và Ruby đều hỗ trợ các tham số có tên theo cách bạn mô tả. Nếu tính năng này đủ quan trọng, bạn nên cân nhắc sử dụng một trong những ngôn ngữ đó. –

Trả lời

11

Không, trong PHP mà không thể như các văn bản. lập luận sử dụng mảng:

function doSomething($arguments = array()) { 
    // set defaults 
    $arguments = array_merge(array(
     "argument" => "default value", 
    ), $arguments); 

    var_dump($arguments); 
} 

Ví dụ sử dụng:

doSomething(); // with all defaults, or: 
doSomething(array("argument" => "other value")); 

Khi thay đổi một phương pháp hiện có:

//function doSomething($bar, $baz) { 
function doSomething($bar, $baz, $arguments = array()) { 
    // $bar and $baz remain in place, old code works 
} 
+0

Điều này có vẻ như là loại điều tôi nên sử dụng. Sẽ đánh dấu nó là câu trả lời đúng khi tôi có thể. Cảm ơn. – ClarkeyBoy

+0

Chỉ cần nghĩ một điều - hiện tại có 4 đối số, hai trong số đó là tùy chọn. Tôi muốn thêm một 4. Bằng cách thực hiện phương pháp này tôi sẽ giảm nó vào một đối số (một mảng). Điều này sẽ phá vỡ bất kỳ cuộc gọi đến các chức năng bên ngoài của tập tin tôi muốn thay đổi điều này trong.Nó đã được lứa tuổi kể từ khi tôi cuối cùng đã làm bất kỳ PHP, nhưng tôi giả định rằng tôi chỉ có thể tạo ra một chức năng được gọi là cùng một điều nhưng với một số khác nhau của các đối số. Không lý tưởng - nhưng điều đó sẽ hiệu quả. – ClarkeyBoy

+0

@ClarkeyBoy Bạn có thể có nhiều đối số như bạn muốn. Xem ví dụ bổ sung. – sanmai

3

Có một cái nhìn tại func_get_args: http://au2.php.net/manual/en/function.func-get-args.php

+0

Cảm ơn bạn đã nhập liệu - nhưng tôi nghĩ câu trả lời của sanmai phù hợp với hoàn cảnh của tôi tốt hơn một chút. Với phương pháp này, tôi sẽ không thể lấy một đối số theo tên - vì vậy tôi sẽ nhấn vào cùng một bức tường gạch (tôi nghĩ). – ClarkeyBoy

2

đối số được đặt tên là hiện không có sẵn trong PHP (5.3).

Để giải quyết vấn đề này, bạn thường thấy hàm nhận đối số array() và sau đó sử dụng extract() để sử dụng đối số được cung cấp trong biến cục bộ hoặc array_merge() để đặt mặc định.

dụ ban đầu của bạn sẽ giống như thế:

$args = array('do' => 'do', 'or' => 'not', 'nothing' => 'something'); 
doSomething($args); 
0

PHP không có thông số được đặt tên. Bạn sẽ phải quyết định một cách giải quyết.

Thông dụng mảng phổ biến nhất được sử dụng. Nhưng một phương pháp thông minh khác là sử dụng thông số URL, nếu bạn chỉ cần giá trị bằng chữ:

function with_options($any) { 
     parse_str($any); // or extract() for array params 
} 

with_options("param=123&and=and&or=or"); 

Kết hợp cách tiếp cận này với thông số mặc định phù hợp với trường hợp sử dụng cụ thể của bạn.

+0

Thật là quá mức cần thiết! Cân nhắc truyền một vật thể theo cách này. – sanmai

+2

@sanmai: Luôn phụ thuộc vào cách sử dụng. Microoptimizations là dành cho kẻ ngu. Và tưởng tượng trên đầu là thích hợp hơn để cản trở bản thân với một API vụng về. – mario

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