Co warto zmienić w PHP 9.0?

0

Wielu programistów na różnych stronach twierdzi że nadszedł czas aby pozbyć się $ i <br>i dodać nowoczesne pętle jak dodali match zamiast starego mało czytelnego switch.
https://www.php.net/releases/8.2/en.php

<?php
$food = 'cake';

$return_value = match ($food) {
    'apple' => 'This food is an apple',
    'bar' => 'This food is a bar',
    'cake' => 'This food is a cake',
};

var_dump($return_value);

W 2023 roku PHP nadal jest na 79.1% wszystkich stron internetowych, więc może warto by go było jeszcze lepiej ulepszyć. Skoro w najbliższym czasie i tak się nigdzie nie wybiera na emeryturę?
https://kinsta.com/blog/php-frameworks/

3

Wielu programistów na różnych stronach twierdzi że nadszedł czas aby pozbyć się $

Najlepiej to pozbyc sie PHP

4

Czym różnią się poniższe:
echo
$echo
echo()

PHP ma wiele mchu, który powoduje, że $ jest praktycznie niezbędne. Zwiększa czytelność i odróżnia zmienną od konstrukcji języka.

Switch jest czytelny, match jest czytelny, ale działają w różny sposób (switch korzysta z luźnego operatora porównania) i można je wykorzystać na różne sposoby w zależności od tego co chcemy osiągnąć. I skąd wniosek, że match zastąpił switch? One (konstrukcje) funkcjonują niezależnie.

Jakich programistów i na jakich stronach? Co masz na myśli pisząc, że należy się pozbyć HTMLowego znacznika br?

3

Może chodziło Ci o break jako przerwanie pętli?
W wielu językach jest to dostępne. Tylko trzeba używać z głową.
Żeby pozbyć się $ to by trzeba z 2 wersje główne co najmniej, najpierw jakieś wyłapanie słów kluczowych i dodanie deprectaed potem dopiero jakaś nowa wersja. Tylko co komu ten dolar przeszkadza. To najmniejszy problem w PHP.

1

Jeśli chciałbyś usunąć $ ze zmiennych, to musiałbyś też usunąć funkcjonalność języka, czyli wołanie funkcji po nazwie zmiennej.

Chodzi o to że teraz w języku można zrobić coś takiego:

$name = "array_values";
$name(); // wywołanie funkcji

$name = "ArrayIterator";
new $name(); // instancja klasy

$name = "current";
$iterator->$name(); // wywołanie metody

$name = "attribute";
$object->$name; // odczytanie pola

Albo ewentualnie wynaleźć inną notację do wyrażenia takich operacji.

1
Riddle napisał(a):

Jeśli chciałbyś usunąć $ ze zmiennych, to musiałbyś też usunąć funkcjonalność języka, czyli wołanie funkcji po nazwie zmiennej.

Chodzi o to że teraz w języku można zrobić coś takiego:

$name = "array_values";
$name(); // wywołanie funkcji

$name = "ArrayIterator";
new $name(); // instancja klasy

$name = "current";
$iterator->$name(); // wywołanie metody

$name = "attribute";
$object->$name; // odczytanie pola

Albo ewentualnie wynaleźć inną notację do wyrażenia takich operacji.

Dwie pierwsze może mogłyby zadziałać. Co do ostatniej, na CR nie przepuszczam czegoś takiego. Oczywiście można, ale wraz z usunięciem dynamicznych atrybutów, trochę przestaje mieć to sens.

0
jurek1980 napisał(a):
Riddle napisał(a):

Jeśli chciałbyś usunąć $ ze zmiennych, to musiałbyś też usunąć funkcjonalność języka, czyli wołanie funkcji po nazwie zmiennej.

Chodzi o to że teraz w języku można zrobić coś takiego:

$name = "array_values";
$name(); // wywołanie funkcji

$name = "ArrayIterator";
new $name(); // instancja klasy

$name = "current";
$iterator->$name(); // wywołanie metody

$name = "attribute";
$object->$name; // odczytanie pola

Albo ewentualnie wynaleźć inną notację do wyrażenia takich operacji.

Dwie pierwsze może mogłyby zadziałać. Co do ostatniej, na CR nie przepuszczam czegoś takiego. Oczywiście można, ale wraz z usunięciem dynamicznych atrybutów, trochę przestaje mieć to sens.

To czy to jest zasadne to inna kwestia, bo PHP jest pełen bardzo głupich pomysłów.

0

Pytanie: czy dałoby radę wprowadzić zmianę, aby wywoływać metody z obiektów za pomocą kropki zamiast ->, a wtedy symbolem konkatenacji byłby znak plusa zamiast kropki?

Wiem, że wersje jeżyków programowania muszą być wstecznie kompatybilne, ale z tego co wiem w PHP od jakiejś wersji można "włączyć" statyczne typowanie w argumentach funkcji poprzez instrukcję:

declare(strict_types=1);

I teraz się zastanawiam, czy nie dałoby rady zrobić podobnej instrukcji, która sprawiłaby, że znak kropki jest interpretowany jako operator wywołania metody, a konkatenacje stringów można zrobić za pomocą plusa?

Fajnie mi się kiedyś programowało podstawy w php, ale ciężko było mi się przestawić na tą strzałkę przy wywoływaniu metod w obiektach.

2

@kario97:
To mi się kojarzy z JS. Kropka jest fajna dopóki nie wchodzi w konflikt z czym innym. Dam przykład: w JS takie coś "40" + 4 wywołuje ból głowy (sam przerób różne kombinacje). W PHP takie operacje są bardziej jednoznaczne i logiczne: "40" + 4 zawsze da 44 bo jest to suma a "40" . 4 zawsze da stringa "404" bo kropka jest przeznaczona (między innymi) do konkatenacji. Co do reszty; nie statyczne typowanie a ścisłe typowanie, języki nie muszą być zgodne wstecz w 100% (drastyczny przypadek Pythona).

2
kario97 napisał(a):

Pytanie: czy dałoby radę wprowadzić zmianę, aby wywoływać metody z obiektów za pomocą kropki zamiast ->, a wtedy symbolem konkatenacji byłby znak plusa zamiast kropki?

Wiem, że wersje jeżyków programowania muszą być wstecznie kompatybilne, ale z tego co wiem w PHP od jakiejś wersji można "włączyć" statyczne typowanie w argumentach funkcji poprzez instrukcję:

declare(strict_types=1);

I teraz się zastanawiam, czy nie dałoby rady zrobić podobnej instrukcji, która sprawiłaby, że znak kropki jest interpretowany jako operator wywołania metody, a konkatenacje stringów można zrobić za pomocą plusa?

Fajnie mi się kiedyś programowało podstawy w php, ale ciężko było mi się przestawić na tą strzałkę przy wywoływaniu metod w obiektach.

Nie wiem czy to ma jakąkolwiek zaletę.

To wgl wygląda nie jakbyś chciał poprawić język, tylko jakbyś chciał go zmienić żeby pasował do Twoich przyzwyczajeń ;|

Różne języki mają różne składnie. W C++ też jest -> i nikt nie chce tego zmienić.

3

Na ten moment brakuje rozwiązań, które wprowadzałby asynchroniczność (oficjalnych, wbudowanych, natywnych). Dlatego node.js tutaj ma przewagę. Reszta rzeczy o których piszecie to kosmetyka, gdzie programistom, którzy na codzień używają php w niczym nie przeszkadzaja bo weszły w krew i nawet nie zwracją na nie uwagi.

0

@dervill: bo w php nie jest potrzebna asynchroniczność, jeden request nie blokuje drugiego, a rzeczy mocno obciążające/wymagające długiego czasu i tak lepiej puścić w jakieś joby i kolejkować.

0
ehhhhh napisał(a):

@dervill, a rzeczy mocno obciążające/wymagające długiego czasu i tak lepiej puścić w jakieś joby i kolejkować.

PHPowcy tak robią, bo inaczej się nie da. Linus Torvals mówił kiedyś, że jak coś działa bardzo szybko to ludzie zaczynają robić z tym różne rzeczy, których normalnie by nie robili.

W przypadku języka/platformy lepiej mieć więcej możliwości niż mniej

1

@slsy: w pythonie też kolejkuje, pomimo, że można by strzelić osobny wątek, ma to po prostu swoje niepodważalne zalety.

0
Riddle napisał(a):
kario97 napisał(a):

Pytanie: czy dałoby radę wprowadzić zmianę, aby wywoływać metody z obiektów za pomocą kropki zamiast ->, a wtedy symbolem konkatenacji byłby znak plusa zamiast kropki?

Wiem, że wersje jeżyków programowania muszą być wstecznie kompatybilne, ale z tego co wiem w PHP od jakiejś wersji można "włączyć" statyczne typowanie w argumentach funkcji poprzez instrukcję:

declare(strict_types=1);

I teraz się zastanawiam, czy nie dałoby rady zrobić podobnej instrukcji, która sprawiłaby, że znak kropki jest interpretowany jako operator wywołania metody, a konkatenacje stringów można zrobić za pomocą plusa?

Fajnie mi się kiedyś programowało podstawy w php, ale ciężko było mi się przestawić na tą strzałkę przy wywoływaniu metod w obiektach.

Nie wiem czy to ma jakąkolwiek zaletę.

To wgl wygląda nie jakbyś chciał poprawić język, tylko jakbyś chciał go zmienić żeby pasował do Twoich przyzwyczajeń ;|

Różne języki mają różne składnie. W C++ też jest -> i nikt nie chce tego zmienić.

Racja, jestem przyzwyczajony do kropki i to zawsze o jeden znak mniej do wywołania metody niż strzałka ->, ale masz racje, to kwestia przyzwyczajenia

0
Riddle napisał(a):

Nie wiem czy to ma jakąkolwiek zaletę.

To wgl wygląda nie jakbyś chciał poprawić język, tylko jakbyś chciał go zmienić żeby pasował do Twoich przyzwyczajeń ;|

Różne języki mają różne składnie. W C++ też jest -> i nikt nie chce tego zmienić.

Ale kropka jest do obiektów przez referencję, a strzałka do dostępu przez wskaźnik, można używać zamiennie, rzutować referencję na wskaźnik lub odwrotnie i można wtedy zamieniać syntax. No i konkatenacje stringów możesz zrobić za pomocą plusa, bo add operator można overloadingiem podmienić.

0
kario97 napisał(a):

Racja, jestem przyzwyczajony do kropki i to zawsze o jeden znak mniej do wywołania metody niż strzałka ->, ale masz racje, to kwestia przyzwyczajenia

Każde dobre IDE ma funkcje, że jak wpiszesz - po obiekcie, to wstawi Ci automatycznie ->, więc pisanie nie jest wcale wolniejsze.

0
junior_frontend napisał(a):
Riddle napisał(a):

Różne języki mają różne składnie. W C++ też jest -> i nikt nie chce tego zmienić.

Ale kropka jest do obiektów przez referencję, a strzałka do dostępu przez wskaźnik, można używać zamiennie, rzutować referencję na wskaźnik lub odwrotnie i można wtedy zamieniać syntax.

Dokładnie, nawet w C# jest strzałka do pracy ze wskaźnikami:

    private unsafe static void Main(string[] args)
    {
        Test foo = new(5);
        var bar = &foo;
        Console.WriteLine(bar->W);
        // to samo co
        Console.WriteLine((*bar).W);
    }

    record Test(int W);

choć szczerze mówiąc nigdy nie widziałem kodu ze strzałkami w C# na wolności. Jest tyle mechanizmów na pracę w trybie "safe" i zarządzanym że praca z gołymi wskaźnikami zostaje tylko dla zabawy i ew. marshallingu.

Riddle napisał(a):

Każde dobre IDE ma funkcje, że jak wpiszesz - po obiekcie, to wstawi Ci automatycznie ->, więc pisanie nie jest wcale wolniejsze.

ha tfu na wszelkie autokorekty i automatyczne wstawianie czegokolwiek. Czemu miałoby mi znak minusa zamienić na strzałkę jak może akurat chcę coś odjąć tylko nie dokończyłem kodu. Czasami linijkę kodu piszę od końca albo nawet od środka jak muszę się nad częścią dłużej zastanowić. Ale akurat napisanie "->" nie zajmuje dużo więcej niż kropki więc też żaden argument.

Riddle napisał(a):

Jeśli chciałbyś usunąć $ ze zmiennych, to musiałbyś też usunąć funkcjonalność języka, czyli wołanie funkcji po nazwie zmiennej.

Chodzi o to że teraz w języku można zrobić coś takiego:

$name = "array_values";
$name(); // wywołanie funkcji

$name = "ArrayIterator";
new $name(); // instancja klasy

$name = "current";
$iterator->$name(); // wywołanie metody

$name = "attribute";
$object->$name; // odczytanie pola

Nie nie przeszkadza żeby zostawić $ dla takich przypadków jako "znacznik refleksji", można by zrobić:

name = "array_values";
$name(); // wywołanie funkcji

// choć lepsze by było jak w bardziej normalnych językach:
name = array_values; // opcjonalnie $"array_values"
name();

name = "ArrayIterator";
new $name(); // instancja klasy

name = "current";
iterator->$name(); // wywołanie metody
 
name = "attribute";
object->$name; // odczytanie pola

i nawet mogłoby to być wstecznie kompatybilne z opcjonalnym $ przy przypisywaniu i odczytywaniu zmiennych.

Ogólnie podoba mi się ten wątek rozmawiania o rozwoju php 9 tak jakby ktokolwiek tutaj miał cokolwiek do gadania w tej kwestii.

0
obscurity napisał(a):
Riddle napisał(a):

Jeśli chciałbyś usunąć $ ze zmiennych, to musiałbyś też usunąć funkcjonalność języka, czyli wołanie funkcji po nazwie zmiennej.

i nawet mogłoby to być wstecznie kompatybilne z opcjonalnym $ przy przypisywaniu i odczytywaniu zmiennych.

Są inne powody czemu to nie mogłoby działać, chociażby dlatego że jak dereferencujesz zapis bez $, np echo value;, to PHP szuka stałej o nazwie value, np:

define('value', 3);
echo value; // 3

Dolar $ miał właśnie znaczyć że coś jest zmienne, więc jeśli chciałbyś wywalić $ to musiałbyś albo wywalić stałe, albo znaleźć jakąś inną notacje dla stałych.

Już nie mówiąc o tym, że skoro dereferencja zmiennej bez dolara miałaby działać, np value = 4; echo value;, to musiałoby to znaczyć że miałoby się dać wywołać funkcje np (value)() nawet bez dolara.

Także uważam że usuwanie dolara z notacji zmiennych to mega słaby pomysł. Równie dobrze mógłbyś wymyślić nowy język.

1
Riddle napisał(a):

Są inne powody czemu to nie mogłoby działać, chociażby dlatego że jak dereferencujesz zapis bez $, np echo value;, to PHP szuka stałej o nazwie value
...
Dolar $ miał właśnie znaczyć że coś jest zmienne, więc jeśli chciałbyś wywalić $ to musiałbyś albo wywalić stałe, albo znaleźć jakąś inną notacje dla stałych.

Nie widzę powodu czemu stałe miałyby być traktowane osobno. W innych językach nie ma zazwyczaj rozróżnienia w korzystaniu ze stałych / zmiennych i można je nazywać i używać w ten sam sposób. Jedyna różnica która powinna być to taka że do stałych nie można nic przypisać. Skoro php już obsługuje stałe bez dolara to nie powinno być większego problemu z rozszerzeniem tego na zmienne.

Riddle napisał(a):

Już nie mówiąc o tym, że skoro dereferencja zmiennej bez dolara miałaby działać, np value = 4; echo value;, to musiałoby to znaczyć że miałoby się dać wywołać funkcje np (value)() nawet bez dolara.

Nie widzę za bardzo problemu. Tak naprawdę php reaguje na "wywołanie" stringa, więc obecnie działa też:

"array_values"();

nie trzeba żadnych dolarów, nie widzę dodatkowych problemów z usunięciem ich tutaj.

0
obscurity napisał(a):

Nie widzę za bardzo problemu.

No i to trochę problem, że tak bezkrytycznie patrzysz na to.

obscurity napisał(a):
Riddle napisał(a):

Już nie mówiąc o tym, że skoro dereferencja zmiennej bez dolara miałaby działać, np value = 4; echo value;, to musiałoby to znaczyć że miałoby się dać wywołać funkcje np (value)() nawet bez dolara.

Nie widzę za bardzo problemu. Tak naprawdę php reaguje na "wywołanie" stringa, więc obecnie działa też:

"array_values"();

nie trzeba żadnych dolarów, nie widzę dodatkowych problemów z usunięciem ich tutaj.

Nie odpowiadasz na mój argument.

W moim poście chodziło o to że:

  • call "array_values"() oraz ("array_values")() da ten sam wynik (wywołanie funkcji array_values(), i to jest w porządku.
  • Dla propozycji autora wątku - czyli zmiennej bez dolara, call (value)() da inny wynik niż value(), i to już jest nie okej i nie intuicyjne. Pierwszy wywoła funkcję o nazwie która siedzi w zmiennej value, drugi wywoła funkcję value(). To miałem na myśli w moim poście że to jest zły pomysł. Dlatego aktualnie w PHP istnieją dwa osobne zapisy $value() oraz value(). I $value() działa tak samo jak ($value)().
obscurity napisał(a):
Riddle napisał(a):

Są inne powody czemu to nie mogłoby działać, chociażby dlatego że jak dereferencujesz zapis bez $, np echo value;, to PHP szuka stałej o nazwie value
...
Dolar $ miał właśnie znaczyć że coś jest zmienne, więc jeśli chciałbyś wywalić $ to musiałbyś albo wywalić stałe, albo znaleźć jakąś inną notacje dla stałych.

Nie widzę powodu czemu stałe miałyby być traktowane osobno. W innych językach nie ma zazwyczaj rozróżnienia w korzystaniu ze stałych / zmiennych i można je nazywać i używać w ten sam sposób. Jedyna różnica która powinna być to taka że do stałych nie można nic przypisać. Skoro php już obsługuje stałe bez dolara to nie powinno być większego problemu z rozszerzeniem tego na zmienne.

I jak miałoby to działać konkretnie?

value = 2;
define('value', 3);

Zmienna nadpisana przez stałą? Super pomysł.

Poza tym, królicza nora biegnie dalej, bo nawet jeśli to miałoby tak działać, to w PHP jest mechanizm taki, że nie możesz użyć zmiennej która nie istnieje, ale możesz użyć stałej która nie istnieje - i w momencie w którym użyjesz stałej która nie istnieje, to PHP zwraca nazwę tej stałej, np:

<?php
echo missing_constant; // "missing_constant"

Więc wtedy, gdybyś używał zmiennej która nie istnieje, np

<?php
a = 2;
echo b; // to by zwróciło "b"

I znowu, znaczy to że albo zmienne muszą mieć $, albo handling stałych w PHP trzeba by zmienić.

To miałem na myśli dwa posty temu, że powiedziałem że usunięcie $ ciągnie za sobą tyle konsekwencji, że praktycznie musiałbyś mieć nowy język. Przy czym zaznaczam : da się mieć język w którym zmienne dereferencuje się bez dolara - przecież każdy inny język oprócz PHP taki jest :D Ale to nie jest taka "prosta" zmiana, jak po prostu zabranie dolara, tylko cały język praktycznie wtedy pada.

Cała składnia PHP jest zaprojektowawna dookoła tych dolarów.

1

Może trochę podsumujemy. Czy można usunąć dolar? Można. Tylko po pierwsze po co? Po drugie ile zmian i wersji pośrednich trzeba by zrobić.
Skoro w innych językach są zmienne i stale bez dolara, czy nie ma np. nawiasów dla ciał funkcji itp. to i tu można by to zrobić. Podkreślam tylko. Po co?

0

@obscurity: php storm jak zrobisz - bez spacji przed i wie, że to jest obiekt to sam robi strzałkę i nigdy sie przy tym nie myli.

1
Riddle napisał(a):
  • Dla propozycji autora wątku - czyli zmiennej bez dolara, call (value)() da inny wynik niż value(), i to już jest nie okej i nie intuicyjne. Pierwszy wywoła funkcję o nazwie która siedzi w zmiennej value, drugi wywoła funkcję value(). To miałem na myśli w moim poście że to jest zły pomysł. Dlatego aktualnie w PHP istnieją dwa osobne zapisy $value() oraz value(). I $value() działa tak samo jak ($value)().

no akurat to według mnie jest proste, po prostu php przyjmuje zarówno funkcja() jak i "funkcja"(). Jeśli to funkcja to wywołuje funkcję, a jeśli to string to wywołuje funkcję o nazwie ze stringa.

Więc tak samo ze zmiennymi - niezależnie czy zmienna przechowuje referencję funkcji czy string zadziała to tak samo. Zmienna nigdy nie będzie przechowywała jednocześnie stringa i funkcji. Jedyne ograniczenie które trzeba tu wprowadzić to że zmienne nie mogą się nazywać tak samo jak funkcje lub nadpisują się w danym scopie tak jak w innych językach.

Riddle napisał(a):

I jak miałoby to działać konkretnie?

value = 2;
define('value', 3);

Zmienna nadpisana przez stałą? Super pomysł.

już nie pamiętam php dobrze. To stałe nie są dostępnie globalnie tylko od danego miejsca? W innych językach też proste wyjście na to - po prostu błąd parsera:

let value = 2;
const value = 3; // Uncaught SyntaxError: Identifier 'value' has already been declared

Wszystko się da, ciężko tylko zachować kompatybilność wsteczną. Ja nie widzę niestety ratunku dla składni PHP.

Jedynym logicznym wyjściem mógłby być język transpilowany do php tak jak typescript do javascript.
Szybkie googlowanie mówi że takie projekty już istnieją, przykładowo https://tht.dev/ - ten język pośredni akurat nie rozwiązuje "problemu" brzydkich dolarów.

Jest też dużo lepiej wspierany i popularniejszy https://haxe.org/ który może transpilować do wielu języków - po stronie backendu zarówno do PHP jak i node.js. Prawdopodobnie daleko mu do php i nie jest to tylko zmiana składni tylko zupełnie inny język z innymi bibliotekami, wygląda ciekawie.

0

Mi brakuje w PHP dyrektywy synchronized z Javy, gdzie można sobie zsynchronizować jakiś blok kodu.

Czasami bardzo się przydaje, a teraz zamiast tego trzeba korzystać z takich wynalazków jak np. sync / semafory.

1 użytkowników online, w tym zalogowanych: 0, gości: 1