PHP 7, как вам?))

Активист

Активист
Команда форума
Няяяяяяяяяяяяяяяяяяяяя.. Скаляры!! ))

PHP:
keeper@keeper:~$ cat php7.php 
<?php

function hello(int $int): string {

    return $int . " monkeys";
}

function hello_num(int $int): string {

    return $int;
}

function hello_int(string $int): int {

    return  $int;
}

var_dump( hello(2) );
var_dump( hello(3.2) );
var_dump( hello("4") );
var_dump( hello("4names") );

#var_dump( hello(fopen("/tmp/hello", "w+")) ); // Argument 1 passed to hello() must be of the type integer, resource given, called in /home/keeper/php7.php on line 12 and defined in /home/keeper/php7.php on line 3
#var_dump( hello_num("Hello!") ); // Fatal error: Argument 1 passed to hello_num() must be of the type integer, string given, called in /home/keeper/php7.php on line 24 and defined in /home/keeper/php7.php on line 8

var_dump( hello_int("4You too!") );
#var_dump( hello_int("You too!") ); // Fatal error: Return value of hello_int() must be of the type integer, string returned in /home/keeper/php7.php on line 15 in /home/keeper/php7.php on line 15
Код:
keeper@keeper:~$ /opt/php7/compiled/bin/php php7.php 
string(9) "2 monkeys"
string(9) "3 monkeys"
string(9) "4 monkeys"
string(9) "4 monkeys"
int(4)
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Где-то я уже это видел
 

Активист

Активист
Команда форума
Это уже можно попробовать в реальных проектах (php-cgi по крайней мере завелся норм) На PHP 7 движек запустился норм, правда не могу собрать imagick , в т.ч. из RC ветки, проблема на Debian с ImageWand

Вот еще жесткий Strict.
PHP:
<?php
declare(strict_types=1);

var_dump(strcmp(10.2, 13.2));
// Fatal error: strcmp() expects parameter 1 to be string, float given in /home/keeper/php7-dev.php on line 4
Грустно, что нет возможности создавать разные прототипы для одноименных функций (методов), типа того:

PHP:
function hello(int $str) {
}

function hello(string $str) {
}
 

AmdY

Пью пиво
Команда форума
наоборот - это счастье, нафик не нужно разное поведение в зависимости от типа. Да и вообще это смерть php, как только большинство библиотек перейдут на поддержку хинтов скаляров, язык лишится своего конкурентного преимущества. Для пыха нормальным было бы hello_int("4You too!") -> 4, а так придётся плясать с бубном для всех переменных с форм.
 

Активист

Активист
Команда форума
наоборот - это счастье, нафик не нужно разное поведение в зависимости от типа. Да и вообще это смерть php, как только большинство библиотек перейдут на поддержку хинтов скаляров, язык лишится своего конкурентного преимущества. Для пыха нормальным было бы hello_int("4You too!") -> 4, а так придётся плясать с бубном для всех переменных с форм.
Ну, никто не заставляет декларировать жесткую типизацию, допустим у меня проект под PHP 5.6 завелся без единого Notice на PHP 7 хоть из Dev ветки, но имхо, жесткая типизация очень полезна - она позволяет избежать множества проблем, в т.ч. в безопасности... Своеобразное приведение типов PHP накладывает определенные сложности при разработке, которые чаще называют не багом, а фичей. Что касается разных прототипов - скажем, красиво было бы (понятно что из си, но все же )

PHP:
public function hello(stdClass $obj)
{
print $obj->name;
}

public function hello(string $name)
{
print $name;
}
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
AmdY, помнится мне, mysql расширение вообще все в стрингах возвращает и срать оно хотело на то, что id - вообще интовый автоинкремент. Понимаю, что оно как бы deprecated, но нахера это было сделано? Null тип же обрабатывается норм.

PS: mysqli такое же говно =(
 

hell0w0rd

Продвинутый новичок
наоборот - это счастье, нафик не нужно разное поведение в зависимости от типа. Да и вообще это смерть php, как только большинство библиотек перейдут на поддержку хинтов скаляров, язык лишится своего конкурентного преимущества. Для пыха нормальным было бы hello_int("4You too!") -> 4, а так придётся плясать с бубном для всех переменных с форм.
Где типизация - там и перегрузка функций. Какое конкурентное приемущество теряется, когда все это не обязательно?
Для пыха нормальным было бы hello_int("4You too!") -> 4
Где же это нормально? Типо шарм от "прострели себе ногу с php" пропадет?
 
Последнее редактирование:

scorpion-ds

Новичок
Думаю PHP 7, нам ждать еще год как минимум до стабильного релиза, а когда выйдет не факт, что все подобные "фишки" войдут в релиз.

Потом, еще года два ждать SF4, ZF3 и т.п., где начнут использовать PHP7.
 

fixxxer

К.О.
Партнер клуба
наоборот - это счастье, нафик не нужно разное поведение в зависимости от типа. Да и вообще это смерть php, как только большинство библиотек перейдут на поддержку хинтов скаляров, язык лишится своего конкурентного преимущества. Для пыха нормальным было бы hello_int("4You too!") -> 4, а так придётся плясать с бубном для всех переменных с форм.
Не-не-не, все хорошо. Строгая типизация работает в контексте места вызова, так что для библиотеки strict_types=1 будет внутренним требованием, но не внешним.

PHP:
#cat strict-lib.php
<?php
declare(strict_types=1);

function inc(int $value) {
    return $value + 1;
}

# cat strict.php
<?php
declare(strict_types=1);
include "strict-lib.php";
var_dump(inc(4));
var_dump(inc("4asd"));

# cat non-strict.php
<?php
include "strict-lib.php";
var_dump(inc(4));
var_dump(inc("4asd"));
Код:
pkgbuild@trusty_pkgbuild:~/tmp$ /home/pkgbuild/php-src-master/sapi/cli/php strict.php
int(5)

Fatal error: Argument 1 passed to inc() must be of the type integer, string given, called in /home/pkgbuild/tmp/strict.php on line 5 and defined in /home/pkgbuild/tmp/strict-lib.php on line 4

pkgbuild@trusty_pkgbuild:~/tmp$ /home/pkgbuild/php-src-master/sapi/cli/php non-strict.php
int(5)
int(5)
 

Redjik

Джедай-мастер
а че - перегрузка тоже будет? тогда хочу хочу...
http://www.sitepoint.com/php-7-revolution-return-types-removed-artifacts/
no multiple return types. If your function returns either an array, or an Iterator object, there’s no way to indicate that via, for example, array|Iterator as we do in docblocks.
сразу generics вспомнились из недавнего =)))
аля
PHP:
interface Foo
{
    public function getBarCollection(): ArrayCollection<Bar>;
}
 

fixxxer

К.О.
Партнер клуба
Redjik, параметрической перегрузки конечно же не будет, это несовместимо с идеей strict_types с контекстами. Хотя если без примитивов, то ничего не мешает, но это будет выглядеть очень странно. По той же причине и дженериков, скорее всего, не будет :(
 

AmdY

Пью пиво
Команда форума
забавно получается это же как @. либа на уровне тайпхинта проверила, что я передал int, а я задавил это указав строку.
 

hell0w0rd

Продвинутый новичок
AmdY, ничего ты не задавил)) это как use strict в js. Либа внутри может быть сколько угодно строгой, а извне ты ее можешь использовать как тебе нравится.
Но судя по тому, что Стогов голосовал против - на уровне JIT-компиляции эти режимы будет реализовать не просто
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Сверху