$val = Arr::path($arr, 'get.some.inner.value','or other');
Но это совсем не быстрее этого $val = @$arr['get']['some']['inner']['value']?:'or other';
Удобно? Быстрее?empty
является обычным перевернутым «оператором» булевого нестрогого сравнения с игнорированием ошибки неинициализированной переменной и его использование в контексте «либо переменная, либо другое значение» очень удобно с тернарным оператором, но невозможно, поскольку возвращает булево, а не значение. error_reporting(E_ERROR)
и никакая проверка не проводилась. Разработку вести с такой директивой совесть не позволяет. Поэтому пришлось расставлять проверки. Но это выявило лексическую тяжбу в PHP, которую хочется решить наиболее удобным методом. <?php
ini_set('memory_limit', '512M');
error_reporting(E_ALL);
class test {
static $current;
static $emits;
static $times = [];
static function start($n){
self::$current = $n;
self::$emits[$n]=[];
self::$times[$n] = microtime(1);
}
static function stop($n){
self::$times[$n] = microtime(1)-self::$times[$n];
}
static function emit($v){
@self::$emits[self::$current][(int)!!$v]+=1;
}
}
class magic
{
protected $p = [];
function __get($name)
{
return $this->p[$name];
}
function __set($name, $value)
{
$this->p[$name] = $value;
}
function __isset($name)
{
return isset($this->p[$name]);
}
function __unset($name)
{
unset($this->p[$name]);
}
}
$len = 1000000;
$Object = new magic();
$Array = [];
for ($i = 0; $i < $len; $i++) {
if($i%3){
$Object->{'p' . $i} = $i;
$Array[$i] = $i;
}
}
//normal section
$test = 'normalWithObject';
test::start($test);
for ($i = 0; $i < $len; $i++) {
$n = 'p' . $i;
test::emit(!empty($Object->{$n}) ? $Object->{$n} : false);
}
test::stop($test);
$test = 'normalWithArray';
test::start($test);
for ($i = 0; $i < $len; $i++) {
test::emit(!empty($Array[$i]) ? $Array[$i] : false);
}
test::stop($test);
//abnormal section
$test = 'abnormalWithObject';
test::start($test);
for ($i = 0; $i < $len; $i++) {
test::emit(@$Object->{'p' . $i} ? : false);
}
test::stop($test);
$test = 'abnormalWithArray';
test::start($test);
for ($i = 0; $i < $len; $i++) {
test::emit(@$Array[$i] ? : false);
}
test::stop($test);
print_r(test::$times);
Array
(
[normalWithObject] => 1.6597728729248
[normalWithArray] => 0.46078515052795
[abnormalWithObject] => 1.5833020210266
[abnormalWithArray] => 0.70977306365967
)
$v = !empty($viewVariable) ? $viewVariable : 'default';
// and
$v = @$viewVariable ? : 'default'; //one pity IDE definition warning
$e = !empty($array['doubtful']['element']) ? $array['doubtful']['element'] : 'default';
// and
$e = @$array['doubtful']['element'] ? : 'default';
$p = !empty($object->magicProperty) ? $object->magicProperty : 'default';
// and
$p = @$object->magicProperty ? : 'default';