Tôi có một vài phương thức "setter" trên các lớp, và để thuận tiện, tôi đã thêm tham số tùy chọn $previous
, tham số này bằng tham chiếu và điền nó với giá trị hiện tại trước khi thay thế bằng một. Ví dụ:Kiểm tra các đối số tùy chọn trong PHP
public function set_value($key, $value, &$previous = null)
{
$previous = $this->get_value($key);
$this->_values[$key] = $value;
return $this;
}
Điều này làm việc tốt; tuy nhiên trong một số trường hợp, phương pháp "getter" tương ứng là một quá trình bit chuyên sâu, và chạy nó vô điều kiện là một sự lãng phí. I figured tôi có thể kiểm tra:
if(null !== $previous)
{
$previous = $this->get_value($key);
}
này không hoạt động, mặc dù thường xuyên biến thông qua như là đối số cho $previous
chưa được xác định trước đó trong đó là phạm vi và giá trị mặc định null anyway. Giải pháp duy nhất tôi đã bị hack ra là:
public function set_value($key, $value, &$previous = null)
{
$args = func_get_args();
if(isset($args[2])
{
$previous = $this->get_value($key);
}
$this->_values[$key] = $value;
return $this;
}
Hoặc, để một dòng nó:
if(array_key_exists(2, func_get_args()))
{
// ...
}
tôi không thích cơ thể phương pháp là dựa vào các chỉ số tham số (khi nó có vẻ là không cần thiết) Có cách nào sạch hơn để đạt được những gì tôi đang ở đây không?
Tôi đã thử:
if(isset($previous)){}
if(!empty($previous)){}
if(null !== $previous){}
Không làm việc.
giải pháp có thể như vậy, cho đến nay:
if(func_num_args() == $num_params){}
if(array_key_exists($param_index, func_get_args())){}
// 5.4
if(isset(func_get_args()[$param_index])){}
// 5.4
if(func_num_args() == (new \ReflectionMethod(__CLASS__, __FUNCTION__))
->getNumberOfParameters()){}
@DaveRandom - Vì vậy, một cái gì đó trong lĩnh vực:
define('_NOPARAM', '_NOPARAM' . hash('sha4096', microtime()));
function foo($bar = _NOPARAM)
{
// ...
}
@hoppa - Sử dụng trường hợp:
$obj->set_something('some_key', $some_value, $previous) // set
->do_something_that_uses_some_key()
->set_something('some_key', $previous) // and reset
->do_something_that_uses_some_key()
-> ...
Thay vì:
$previous = $obj->get_something('some_key'); // get
$obj->set_something('some_key', $some_value) // set
->do_something_that_uses_some_key();
->set_something($previous) // and reset
->do_something_that_uses_some_key();
-> ...
Could not bạn xác định các giá trị mặc định cho '$ previous' như' FALSE' (hoặc một số giá trị của " sai "loại" - sau đó bạn biết rằng nó là 'null' nó đã được thông qua, nhưng nó là' FALSE' (hoặc bất cứ điều gì) nó không phải là. Phương pháp này có lỗ hổng trong nó (người dùng có thể vượt qua giá trị mặc định của bạn) nhưng tôi nghĩ nó sẽ là một cách tiếp cận tốt - đặc biệt nếu bạn đặt giá trị mặc định là một chuỗi ngẫu nhiên dài. . – DaveRandom
@DaveRandom - Giá trị trước đó có thể là boolean 'false' trong một số trường hợp. Tôi đã chọn 'null' cho mục đích ngữ nghĩa của nó," không có giá trị ". – Dan
Xem nhận xét đã chỉnh sửa về chuỗi ngẫu nhiên dài - Tôi thừa nhận đó không phải là cách tiếp cận đẹp hay hoàn hảo, nhưng đó là phương pháp 99.99999% hoạt động ... – DaveRandom