Я часто пишу эту строку кода:
$myParam = isset($params['myParam']) ? $params['myParam'] : 'defaultValue';
Как правило, это делает линию очень длинной для вложенных массивов.
Могу ли я сделать его короче?
function getOr(&$var, $default) { if (isset($var)) { return $var; } else { return $default; } } $myParam = getOr($params['myParam'], 'defaultValue');
Обязательно передайте переменную по ссылке, иначе код будет выдавать E_NOTICE. Также здесь используется намерение if / else вместо тройного оператора, поэтому zval можно использовать, если вы используете PHP <5.4.0RC1.
Да, создав прокси-функцию, но действительно ли это стоит?
Кроме того, isset
– это языковая конструкция, поэтому ее перенос в прокси-функцию ухудшает производительность, хотя деградация, вероятно, будет меньше, чем тривиальная (даже не стоит упоминать об этом).
PHP 7 будет содержать ??
оператор, который делает именно это.
См. https://wiki.php.net/rfc/isset_ternary , например:
// Fetches the request parameter user and results in 'nobody' if it doesn't exist $username = $_GET['user'] ?? 'nobody'; // equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
Это то, что я использую:
function getindex($arr, $index, $default = null) { return isset($arr[$index]) ? $arr[$index] : $default; }
Начиная с PHP 5.3 вы можете использовать:
$myParam = $params['myParam'] ?: 'defaultValue';
Обратите внимание, однако, что $params['myParam']
и isset($params['myParam'])
не на 100% одинаковы.
Я мало использую этот маленький магический класс, который работает как переменный
class Post() { private $post = Array(); public function __construct() { $this->post = $_POST; } public function __get($name) { return @$this->post[$name]; } public function __set($name, $value) { return $this->post[$name] = $value; } public function __call($function, $params) { if(isset($this->post[$function])) { return $this->post[$function]; } else { $this->post[$function] = $params[0]; return $params[0]; } } } $post = new Post();
то в документе вы можете легко его использовать, как и любую другую переменную, например $post->name
$post->somelist[2]
или со значением по умолчанию $post->name("John Doe")
после чего вы получите его обратно а также хранится.
Я знаю, что это ничего не сокращает для вас, но я думал, что просто передаю это, я использую это много в своих приложениях, чтобы убедиться, что что-то установлено и имеет ценность.
function is_blank($var = NULL){ return empty($var) && !is_numeric($var) && !is_bool($var); } function chk_var($var = NULL){ return (isset($var) && !is_null($var) && !is_blank($var)); }
Затем…
if(chk_var($myvar)){ ... }
Нет. К сожалению, вы не можете. Не по-хорошему. Вы, по крайней мере, должны уступить на выступление.
Обновление : с PHP7, ??
будет делать именно это. См. https://wiki.php.net/rfc/isset_ternary
Если вам нужно делать это часто, вы, вероятно, не понимаете смысла.
Фактически, переменные должны быть определены перед использованием .
Таким образом, не должно быть случая, когда у вас есть свой параметр undefined.
Просто создайте файл параметров по умолчанию и инициализируйте каждую переменную.
$params['myParam'] = 'defaultValue';
позже он может быть изменен при некоторых событиях, но он никогда не будет неопределенным.
Есть идея?