tl; dr
Đừng cố gắng đó (nó thực sự thậm chí không làm việc như bạn nhìn thấy), sử dụng DI (dependency injection) thích hợp và thông qua bên ngoài biến (toàn cầu) của bạn như thông số:
// functions should be deterministic — require the arguments in favour of using dynamic defaults
function foo($arg1 /* require it */, $arg2 = 1 /* static scalars as default is no problem */) {
// your code
}
foo($_SESSION["user_id"]); // always pass dynamic arguments, don't fetch them in the function
Giới thiệu
Nó không phải là có thể sử dụng bất cứ thứ gì như mặc định như cái gọi là vô hướng tĩnh. Đây là các hằng số (chuỗi, số nguyên, v.v.), hằng số và (kể từ PHP 5.6) hoạt động trên các hằng số/hằng số này.
Vậy ...
tôi đã có ý tưởng tuyệt vời cùng hơn hai năm trước đây và nộp một báo cáo lỗi ... https://bugs.php.net/bug.php?id=60544
Hôm nay tôi nghĩ đó là một ý tưởng không quá tuyệt vời. Giá trị mặc định được cho là tĩnh bởi ngôn ngữ. Tôi nghi ngờ những người thiết kế PHP đã không có lý do của họ.
Nhưng vẫn có một cách ...
Làm thế nào bạn có thể làm điều đó (không khuyến khích)
Cách giải quyết duy nhất ở đây là sử dụng hằng số.
function foo($arg = ARG) {
var_dump($arg);
}
Tại thời điểm khi bạn chắc chắn rằng giá trị sẽ không thay đổi nữa, xác định hằng số trước khi cuộc gọi đầu tiên của hàm:
define("ARG", $_SESSION["user_id"]);
Sau đó, bạn có thể sau đó chỉ cần gọi nó qua foo();
.
Điều này có thể do đánh giá các hằng số ở đây một cách lười biếng.
Hạn chế của phương pháp này là bạn phải xác định hằng số một lần và sau đó nó sẽ vẫn không đổi cho phần còn lại của thời gian chạy tập lệnh.
Nhưng tôi vẫn mạnh mẽ không khuyên bạn nên. Đó là hackish và có nhược điểm lớn.
Làm thế nào bạn có thể làm điều đó tốt hơn
Bạn đã chỉ ra cho chúng ta một cách làm thế nào để làm điều đó:
$arg1 = ($arg1 !== null) ? $arg1 : $_SESSION['arg1'];
Đó hoàn toàn là cách chính xác. Nếu bạn thực sự muốn làm điều đó.
Nhưng bạn vẫn còn không nên làm điều đó. Bạn đang truy cập phạm vi toàn cầu (superglobals) từ một hàm.
Làm thế nào bạn nên làm điều đó
Có một lý do tại sao các nhà thiết kế ngôn ngữ đã không thực hiện khả năng này và nó là như nhau tại sao chúng ta không nên cố gắng để phá vỡ rằng trong bất kỳ cách nào bởi hằng số hoặc truy cập phạm vi toàn cầu trong các chức năng.
Bạn thực sự nên sử dụng đúng cách tiêm phụ thuộc và chuyển các giá trị bên ngoài (toàn cục) cho các hàm thông qua tham số. (xem ví dụ trong tl; dr phần)
Thể loại mã bạn đang đề xuất có thể dễ dàng dẫn đến mã khó gỡ rối vì mọi người có thể không truy cập được trạng thái toàn cầu. Đó là lý do tại sao chức năng phải có đầu ra xác định cho một đầu vào cụ thể (ngoại trừ nếu chúng được cho là không xác định, ví dụ: một hàm đọc một tệp), làm tăng đáng kể khả năng thử nghiệm và tính di động.
Vui lòng liên kết câu hỏi trước của bạn, vì chúng tôi không biết bạn đang nói về điều gì. [sửa] câu hỏi của bạn) –
Có bạn đi, đã đặt nó vào.: D –
Trong trường hợp cụ thể của một cái gì đó như '$ _SESSION ['user_id']' - tức là một giá trị mà nên duy trì liên tục trong suốt thời gian thực hiện của tập lệnh - bạn * có thể * định nghĩa nó như là một hằng số 'define ('APP_USER_ID', $ _SESSION ['user_id']);' và sau đó hằng số có thể được sử dụng như giá trị mặc định 'function foo ($ arg = APP_USER_ID) {} '. Mặc dù điều này có vẻ là một lựa chọn hấp dẫn (và thực tế khá phổ biến trong thế giới thực), nhưng không * được khuyến khích vì các lý do dựa vào tình trạng toàn cầu, như được nêu trong một vài câu trả lời dưới đây. – DaveRandom