Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
namespace A\B\C;
class Exception extends \Exception {}
$a = new Exception('hi'); // $a - это объект класса A\B\C\Exception
$b = new \Exception('hi'); // $b - это объект класса Exception
$c = new ArrayObject; // фатальная ошибка, класс A\B\C\ArrayObject не найден
function is(){
foreach(func_get_args() as $v){
if(!is_null($v)){
return $v;
}
}
}
$value = is(null,null,false,true,1);
function is(&$args) {
foreach (func_get_args() as $v) {
if (!is_null($v)) {
return $v;
}
}
}
$arr = array('a' => 1, 'b' => false);
var_dump(is($arr['c'], $arr['b'], $arr['a']));
<?php
ini_set('display_errors', true);
error_reporting(-1);
function is(&$args) {
foreach (func_get_args() as $v) {
if (!is_null($v)) {
return $v;
}
}
}
$arr = array('a' => 1, 'b' => false);
var_dump(is($arr['a'], $arr['b'], $arr['c']));PHP Notice: Undefined index: c in test.php on line 15 Notice: Undefined index: c in test.php on line 15 int(1)
Разбираться, почему так происходит, совсем не хочется.
версия под винду
Используйте идентичное окружение и будет вам счастье.
<?php
function is() {
foreach (func_get_args() as $v) {
if (!is_null($v)) {
return $v;
}
}
}
$arr = array('a' => 1, 'b' => false);
var_dump(is($arr['a'], $arr['b'], $arr['c']));
function is($default = null, &$args1 = null, &$args2 = null, &$args3 = null) {
for ($i = 1; func_num_args() > $i; $i++) {
$value = func_get_arg($i);
if (!is_null($value)) {
return $value;
}
}
return $default;
}
$arr = array();
$return = is(false, $arr['a'], $arr['b'], $arr['c']);
var_dump($return);
function is($default = null, ...$args) {
foreach($args as $arg) {
if (!is_null($arg)) {
return $arg;
}
}
return $default;
}
$arr = array();
$return = is(false, $arr['a'], $arr['b'], $arr['c']);
var_dump($return);
function is(&$args1=null, &$args2=null, &$args3=null, &$args4=null, ...) {
function is(&...$args) {
$blablabla ?? $default ?? 'None'isset($blablabla) ? $blablabla : (isset($default) ? $default : 'None')Какой дернуть метод — это уровень роутера.
Если вдруг что-то будет зависеть от наличия поля — мм, окей, это будет if ($request->has('foo')), куда тут всунуть оператор ??, все равно непонятно.
Я говорил именно про isset, намекая на две плохие практики — непосредственную работу с superglobals и anemic models.
В общем же случае — это признак «толстого контроллера» и звоночек, говорящий о необходимости декомпозиции: JSON принципиально ничем не отличается от form-urlencoded, и точно так же может преобразовываться в request и подлежать маршрутизации.
Частое использование isset в контроллере обычно сочетается с superglobals и anemic models. Вот и всё, что имелось ввиду :)
Если приходится часто писать isset, это что-то не то с архитектурой.
God Object не получится, если не пихать все в одну кучу. Из request-а может делаться FormRequest, из него Criteria и т.д.
это уровень роутера
interface Controller {
public function handle(Request $request): Response;
}
ErrorException extends Exception {
\BaseException, после которого уже не будет возникать подобных случаевBaseException (abstract)
+- EngineException
+- ParseException
+- Exception
+- ErrorException
+- RuntimeException
+- ...
+- ...
class Foo {
public static function test() : self {
return new Foo;
}
}
class Bar extends Foo {
public static function test() : parent {
return new Bar;
}
public function action() : int {
return 5;
}
}
namespace Bar;
interface Foo {}
interface FooManager {
public function bind():Foo;
}
class FooImpl implements Foo {}
class FooManagerImpl implements FooManager {
public function bind():FooImpl {
return new FooImpl();
}
}
//Fatal error: Declaration of Bar\FooManagerImpl::bind() must be compatible with Bar\FooManager::bind(): Bar\Foo in *** on line 14
function foo(string $a):bool {
return $a + 1;
}
var_dump(foo(5));//bool(true)
declare(strict_types=1);
function foo($a):float {
return $a + 1;
}
var_dump(foo("asdf5"));//float(1)
declare(strict_types=1);
function foobar(float $abc): int {
return ceil($abc + 1);
}
foobar(123.0);
4. По поводу нового оператора ??, зачем-то изобрели новый костыль, могли бы заюзать то, как это допустим в том же js: var name = obj.name || «Name»Во-первых, зачем использовать то, как в JS, если это не JS?
<?php
$a = $obj->name()['abs'] ?? 'asfd';
var_dump($a);
Fatal error: Call to a member function name() on null in *** on line 2
var a = obj.some() || 5
Uncaught ReferenceError: obj is not defined
Нет nullable
оно если что отконвертирует
Как вам parent?
А почему бы и нет?
declare(strict_types=1);
function foo(float $a):float {
return $a + 1;
}
var_dump(foo("asdf5"));
//Fatal error: Argument 1 passed to foo() must be of the type float, string given
declare(strict_types=1);
function foo(float $a):float {
return $a + 1;
}
var_dump(foo("asdf5"));
//Fatal error: Argument 1 passed to foo() must be of the type float, string given
// к слову раньше там писало про catchable error....
Исходя из пункта выше, JIT некоторые части кода после прогрева переводит в нативный код
function users()
{
foreach($users as $user)
yield $user['id'] => $user;
}
function users()
{
$_users = [];
foreach($users as $user)
$_users[$user['id']] = $user;
return $_users;
}
Самый распространенный пример использования генераторов — реализация xrange для экономии памяти на больших размерах массивов.xrange с лёгкостью заменяется циклом. Это где же это самый распространённый пример?
function at($array, $index, $default)
{
return isset($array[$index]) ? $array[$index] : $default;
}
...
$name = at($_POST, 'name', '');
// Стало
$name = $_POST['name'] ?? '';
<?php
$a = $_POST['a'] ?: 'asdf';
var_dump($a);
Чего ждать, когда ждешь ребенка: PHP 7, часть 2