Які функції ви хотіли б мати в PHP? [зачинено]


88

Оскільки зараз сезон відпусток і всі бажають, я задаюся питанням - які мовні функції ви хотіли б додати PHP? Мене цікавлять деякі практичні пропозиції / побажання щодо мови. Під практичним я маю на увазі:

  1. Щось, що можна зробити практично (не: "Я б хотів, щоб PHP здогадався, що означає мій код, і виправити помилки для мене" або "Я хочу, щоб будь-який код виконувався за 5 мс")
  2. Щось, що не вимагає зміни PHP на іншу мову (не: "Я б хотів, щоб вони скинули знаки $ і використали простір замість дужок" або "Я хочу, щоб PHP були складені, статично набрані і мали # у своєму імені")
  3. Щось, що не вимагає зламати весь існуючий код (не: "Перейменуємо 500 функцій та змінимо порядок параметрів для них")
  4. Те , що робить зміни мови чи будь - небудь цікавий аспект цього (ні: «Я хотів було розширення підтримки для протоколу XYZ» або «Я хочу помилка # 12345 остаточно фіксується»)
  5. Щось більше, ніж скандал (не: "Я б хотів, щоб PHP не сильно смокче")

У когось хороші побажання?

Мода редагувати: Станіслав Малишев - основний розробник PHP.


9
@Stan: Наскільки б ви не хотіли уникати подібних коментарів, ви все одно отримаєте їх. Ці проблеми люди мають з PHP в основному в категоріях речей , які ви виключають у вашому пості. [...]
Рибохід,

24
[...] Ви говорите: "Як ми можемо покращити досвід отримання удару в обличчя, насправді не вдаривши вас в обличчя?" Я маю на увазі, так, отримати безкоштовну каву, коли нас вдарять в обличчя, може бути приємно, це насправді не вирішує багато основних проблем з, ну, ударом в обличчя. Тож, хоча я сподіваюся, що ви отримаєте кілька корисних відповідей (як це вже здається), не дивуйтеся непродуктивним.
Рибний прикорд

5
@Fishtoaster: якщо PHP асоціюється з тобою, коли тебе вдаряють в обличчя, якимось чином тримайся подалі від цього. Ви, безумовно, не зацікавлені в її вдосконаленні. Так буває, хоча є люди, які є. Ця тема для них, а не для вас. Я впевнений, що на цьому сайті є багато тем і для вас, це просто не одна з них.
StasM

5
Я використовую удар в обличчя як приклад - ситуація, коли поверхневі покращення не так важливі; коли проблеми більшості людей пов'язані з основною річчю. Я навіть не збиваю вашу спробу отримати пропозиції щодо таких поверхневих удосконалень - я просто вказую, чому ви, мабуть, отримаєте кілька непрацездатних відповідей, враховуючи ситуацію.
Рибний прикордон

6
@Fishtoaster: Не всі, на диво , ненавидять PHP - мені це завжди подобалося. Дуже гнучка і швидка (до коду).
Увімкнення

Відповіді:


119

Я не заперечував би з названими параметрами.

getData(0, 10, filter => NULL, cache => true, removeDups => true);
// instead of:
getData(0, 10, NULL, true, true);

// or how about:
img(src => 'blah.jpg', alt => 'an albino platypus', title => 'Yowza!');

На жаль, PHP розробники вже зняли цю ідею .


1
Це список від 2005 року. Багато ідей було закрито, а потім відроджене. Насправді, якщо прийде хороша реалізація, є гідний шанс її прийняти.
StasM

21
Це моя улюблена особливість пітона. Робить код дуже самодокументованим.
Кейо

7
@Josh K: Це можливо добре, але виклик "масиву" - це марний сміття, якщо ви хочете. Це лише обтяжує те, що ви дійсно намагаєтесь зробити. Іншим варіантом буде скорочений синтаксис для масивів: make_img (['src' => 'blah.jpg', ...]);
Ерік ван Бракель

2
@Erik: Це теж не поганий варіант, я кажу, чому додавати цю суцільність до мови, коли це можна зробити вже за допомогою другого обгортка масиву.
Джош К

4
@Erik: Більш розслаблена синтаксис для масивів (як, наприклад, []оператор JavaScript ), буде ціною .
Джош К

93

Більше розслаблення:

echo something_that_returns_array()[4];

Інші згадували названі параметри та синтаксис коротших масивів. Я б не заперечував і коротший синтаксис об'єкта.

$a1 = array(1, 2, 3, 4);
$a2 = [1, 2, 3, 4];

$b1 = (object)array('name' => 'foo');
$b2 = {'name' => 'foo'}; // or something?

18
() [] синтаксис вже є в магістралі. На жаль, ярлики масиву були відхилені, але я сподіваюся на воскресіння.
StasM

2
Мені б сподобалася ця особливість. Чому ми можемо мати щось_that_returns_object () -> 4, але не з масивами?
Бала Кларк

4
JavaScript, як масив та позначення об'єктів, буде гойдатися. Як розробник на передньому кінці, саме це мене найбільше турбує у php-коді.
Bleep Bloop

1
@DisgruntledGoat Це так, див .:function something_that_returns_array() { return array( 'a', 'b', 'c', 'd', 'e' ); }
Annika Backstrom

2
@DisgruntledGoat: Проблема з ()->синтаксисом полягає в тому, що він працює лише тоді, коли об’єкт повертається, що ще більше погіршує ситуацію, об'єкт навіть вимагає мати властивість / метод вказаного імені, яке, оптимально, робить те, що ви сподіваєтеся, що це робить , приймаючи параметри, які ви їм надали, і молиться, щоб він більше не потребував ... і т. д. тощо
phant0m

72

Після роботи з PHP близько 13 років, і близько 4 років з JS, є кілька речей, на які я думаю, що PHP добре би запозичив JS:

1) скорочення позначень для масивів та об'єктів. Я вважаю, що це, можливо, було обговорено і збито в "Інтернеті" (тому я чую - мені не подобається бачити, як робиться ковбаса), але я дійсно, дійсно вважаю, що буквальне позначення масивів та об'єктів у JS є великим виграш продуктивності.

Наприклад:

$arr     = [1,2,3,4];
$assoc   = [foo=>'bar', baz=>'boo'];
$stdobj  = {foo->'bar', baz->'boo'};

Є (ІМХО) просто набагато простіше писати і чистіше, ніж

$arr     = array(1,2,3,4); // not too bad
$assoc   = array("foo"=>'bar', baz=>'boo'); // not too bad either
$stdobj  = new stdClass; // this gets pretty rough
$stdobj->foo = 'bar';
$stdobj->baz = 'boo';

Я чув, що було викликано занепокоєння щодо потенційної плутанини, але насправді, чи це більше заплутаність, ніж, скажімо, позначення гередока? Принаймні, зробити об’єкт stdClass в PHP достатньо багатослівний, щоб відмовити практиці, я думаю.

2) Бути в змозі перевизначити раніше визначені функції та методи було б дуже корисно. Зокрема, це спростить ситуації, що розширюють клас, а інстанціювання нового класу є надмірно складним або непрактичним. Я думаю, що нам слід уникати переосмислення основних та непростірних функцій та методів простору користувачів.


Крім цих двох, я думаю, що PHP повинен прозоро підтримувати unicode . Це стає дедалі більшою проблемою для розробників, і рішення, які зараз пропонуються в PHP, є заплутаними та часто невиконаними. Зробити всі стандартні функціональні функції рядків непридатними для коду, було б величезною виграшею для програмістів PHP

Спасибі за питання!


(2) поглянути на runkit. (3) unicode важкий, тим більше, що більшість зовнішнього світу не є unicode. Нам доведеться або вбити продуктивність, або вимагати від людей багато зайвої роботи (як це робить Java). Ось чому зусилля php6 unicode не вийшло.
StasM

8
Що стосується unicode: це може бути важко, але це було б дуже корисно (напевно, розробка PHP сама по собі є важкою, але це дає великі переваги, так?) Можливо, рішенням було б включити прозорий unicode через розширення з розібраним perf компромісом, як XHP? Знову дякую.
Функатрон

5
$ object = (object) масив ("foo" => 'bar', baz => 'boo');
mercutio

3
Я не бачу, як ви можете бачити "більшість зовнішнього світу не є однокодовим"? Ти говориш про людей? Або щось інше? Тому що переважна більшість людей у ​​світі (з величезним запасом) розмовляють мовами, які найкраще представлені Unicode.
Дін Хардінг

1
Однозначно підтримка unicode. Доставка будь-якої програми, що використовується у всьому світі, не є початковою без неї. Незалежно від того, чи розробники PHP вважають, що інженерія в гідній підтримці Unicode є простою чи ні, це вже не суть справи. Людям це потрібно, і вони зловживають шляхом невдач платформи зробити це. Delphi зробив це, додавши інший тип рядка і зробивши його за замовчуванням, з неявним кастингом та глобальним переключенням, щоб повернути стару поведінку. Чому PHP не може це зробити так само?
Joeri Sebrechts

48

Мені б хотілося, як колишній давній апологет PHP:

  1. Коротший синтаксис для масивів. PHP-масиви - одна з найдивовижніших особливостей мови через їх гнучкість, але це тягне записування some_array_method($argity, array('key' => $value));. Я вважаю, що ця пропозиція, на жаль, вже була розроблена в списку розсилки PHP.
  2. finally підтримка
  3. Атрибути / примітки. Вони дозволяють додати користувацьку поведінку до методу таким чином, що дозволяє повторно використовувати код. Наприклад, у рамках MVC можна визначити значення AuthorizeAttribute, яке вказуватиме на те, що контролер або метод дії вимагає авторизації користувача. Сам фреймворк несе відповідальність за пошук атрибутів і відповідне дію на них. Я вважаю, що PHPUnit вже використовує своєрідний атрибут, розміщуючи їх у коментарях docblock, які можна прочитати за допомогою відображення, але введення фактичної функціональності в коментарі docblock - це, звичайно, хак.
  4. Коротший лямбда-синтаксис. Замість того, щоб писати function($x){ return $x*2;}, можливо, я міг би написати $x => return $x*2, чи щось. Це знову ж таки щось, що робить це тягачем для використання цієї функції. Наприклад, $results = array_filter(array(1,2,3), function($a) { return $a % 2; }):проти $results = array_filter(array(1,2,3), $a => return $a % 2 );колишнього просто набагато більше сантехніки, що в принципі не має значення для фактичної роботи, яку ви намагаєтеся виконати.
  5. Вбудований Decimal(математика з фіксованою точкою), який підтримував математичні операції через звичайні оператори, був би непоганим, оскільки у нас немає перевантаження оператора.
  6. МАРИ МАГІЧНІ МЕТОДИ. Магічні методи чудові. Я міг бачити PHP, що додає операторів, що перевантажують магічними методами (я знаю, що це в основному ніколи не відбудеться.) Але в цілому вони забезпечують дійсно чудові способи зачепити мову і робити цікаві речі.

48

Зробіть PHP справді орієнтованим на об'єкт. slap on another global functionЕволюція PHP повинна закінчитися.

array_merge(array_filter(array_intersect_key($arr1, $arr2), "is_int"), $arr3);

Це мені важко читати. Я повинен скласти власний ментальний стек і щось на зразок скласти. В основному це слід читати в зворотному порядку. $dog->wakeup()->bark();легко читати порівняно зbark(wakeup($dog))

$arr1->array_intersect_key($arr2)->array_filter("is_int")->array_merge($arr3);

Ви зробили крок до ввімкнення підтримки об’єктів / методів тепер, будь ласка, використовуйте його у фактичних основних функціях PHP.

Давайте перейменовамо 500 функцій та змінимо порядок параметрів для них.

Переміщення цієї функціональності на методи дозволять перейменовувати їх, використовуючи деякі послідовно. Чи може порушити якусь зворотну сумісність, якби рядки та масиви мали свої методи?


3
Я думаю, що масив не є типом об'єкта - це велика помилка в PHP. Приводить до всіляких неприємностей. На жаль, це еволюційна річ. Тут ви можете робити все, що завгодно, з розширенням чи простором користувачів. Мабуть, добре підійде SPL.
StasM

3
Цей же аргумент стосується рядків. Я просто маю на увазі відсутність методів взагалі. Такі мови, як Java, Python, C # тощо, мають набагато більше читабельного коду. Я думаю, ви шукаєте функції, але виправити те, що порушено IMO, було б краще окупитись.
Кейо

6
Ні, не будь дурним. Було бdog_wake_up($dog); bark_dog($dog);
Матчу,

2
IMHO, будь-які нові строкові методи повинні очікувати та випускати UTF-8 та викидати винятки, якщо вхід недійсний UTF-8. Це значно зменшить потребу в капітальній переробці підтримки Unicode.
rjmunro

1
@luiscubal Ні. Додатковий параметр означатиме, що ми не можемо додавати параметри пізніше, якщо винайдемо нові речі, які потрібно додати до функції. Наприклад, якщо $ string => trim () займає лише пробіли (наприклад, до 4.1.0), то ваша система скаже, що $ string => trim ('ISO-8859-1') обрізана пробіл з рядків ISO-8859-1 . Якщо ми тоді хотіли б обрізати речі, які не були пробілами, ми б не змогли додати параметр для цього, якщо тільки ми не змусимо людей спочатку вказати кодування. Ми повинні заохочувати людей вважати, що будь-який текст у будь-якій точці, яка не є UTF-8, є неправильним .
rjmunro

40

Мовою інтегрованого запиту було б чудово. На зразок подібного до того, що доступно в .NET під назвою LINQ. Це допоможе розібратися через масивні масиви даних та стандартизувати доступ до бази даних, так що менша кількість атак SQL-ін'єкції буде успішною.


2
Все, що полегшує параметризовані запити, стає моїм голосом!
Дін Хардінг

1
Я думаю, що стандартизований доступ до бази даних насправді є дуже важливою перевагою чогось на зразок LINQ, тому що я думаю, що це спрощує тестування одиниць із макетами об’єктів вашої бази даних (оскільки ви знущаєтесь з PHP-коду замість SQL-запитів.)
davidtbernal

я не думаю, що щось подібне повинно впасти в основу. краще впишеться в розширення
pecl

38

Ой. Тип натяку на примітиви. Це було б чудово.


1
Незважаючи на те, що мені подобається принцип KISS PHP (в цілому), я наголошу на цьому. Причина полягає в тому, що якщо ви хочете бути справді захисними, ви отримуєте код перевірки одного типу в кожному методі встановлення. Ми могли б легко відмовитись від цього, якби мова підтримувала це на самому собі.
MicE

4
"Підказки типу" були дуже прикрою назвою, оскільки це не "натяк", це суворе набрання тексту. Думаю, примітивний суворий набір тексту не в змозі в динамічній мові, як PHP. Примусовий набір тексту (те саме, що роблять внутрішні функції - спробуйте strlen (123)) може бути добре.
StasM

6
+1 для цього. Підказки (або суворе введення тексту) у деклараціях функцій були б неймовірно корисними та скоротили б настільки багато, якщо (! Is_int ()) лайно в методі ВСІЙ І ВСІЙ.
Філ Стерджон

5
@StasM Я не згоден. Це ідеально підходить в області динамічної мови, що дозволяє користувачеві вибирати використовувати мову статично введеним способом. І це дозволило б набагато краще вловлювати помилки. Вам не доведеться використовувати його, якщо ви цього не хочете, але особисто мені набридло, щоб рядки проходили там, де я хотів int, а потім мені потрібно шукати код, щоб зрозуміти, куди проходить дурна струна Або ж увесь час увесь перевіряйте.
Даніель Бінгем

2
@StasM Немає абсолютно ніяких причин, щоб вам довелося вводити повністю статично типізовані змінні. Так, ви змістите помилки у коді. В цьому і полягає вся суть. Помилка трапиться під час виклику функції замість внутрішньої функції - що не дає вам уявити, де помилка насправді виникає. Що стосується помилок перетворення типів, помилка відбуватиметься - так, під час виконання - під час виклику функції. Вирішіть проблему, перетворивши там правильний тип. Набагато краще, ніж наявність рядка, з'являється у функції, яка очікує int і не знає, звідки.
Даніель Бінгем

34

Я дуже бажаю кращої підтримки unicode поза коробкою. Більшість мов рухається в цьому напрямку, але на PHP все ще є дивні команди, залиті в усьому світі.

Рядки PHP - це просто байтові масиви. Їх вміст не є портативним, оскільки залежить від поточного кодування за замовчуванням.

Це ж стосується представлення, побудованого серіалізацією. Він містить байтове представлення рядка з попередньо встановленим довжиною, фактично не зберігаючи інформацію про кодування.

Більшість функцій PHP (string) не мають поняття про Unicode. Детальний список, включаючи рівень ризику кожної функції, див. На веб-сторінці : http://www.phpwact.org/php/i18n/utf-8

http://blog.ginkel.com/2010/03/php-unicode-support-or-the-lack-thereof/


Підтримка Unicode виявилася набагато важче, ніж думка. Тому зусилля php6 зупинилися. Наразі у нас є utf-8, і я думаю, що найкращим способом було б додати підтримку utf-8 для рядкових функцій, можливо, як частину розширення intl.
StasM

3
До речі, цитата неправильна. Рядки PHP - це байтові масиви, але їх вміст настільки ж портативний, як і ви їх створюєте, і не залежить від "кодування за замовчуванням" - це просто масив байтів, ви хочете їх у utf8, поставити utf8, хочете utf16 - поставте utf16. Здається, посилання phpwact.org мертве.
StasM

1
Я б дуже сподівався, що розширення intl буде ввімкнено за замовчуванням, тому людям, яким потрібен UTF-8 (чи не всі?), Не довелося боротися зі своїми господарями, щоб заставити рядкові функції вести себе так, як очікувалося.
Еміль Стенстрем

Також дякую за роз’яснення на рядках. Я деякий час відсутній від PHP, тому я трохи іржавий. Я натомість воював з війною Unicode з Python, який має подібні проблеми, як це робить PHP, але вирішує їх у Python 3.
Шведське

Це, безумовно, одна сфера, в якій я хотів би побачити покращення.
Натан Осман,

32

Створіть рядки як об’єкт із вбудованими методами для заміни непослідовно названих та параметризованих не об’єктних. напр

$subject->replace($search,$replace);
$string->split($separator);
$string->trim();

тощо.

Редагувати: ще одне: Ці методи завжди повинні очікувати та випромінювати UTF-8, за винятком тих, які спеціально призначені для роботи з кодуваннями. Якщо вхід недійсний UTF-8, слід виключити виняток, навіть якщо на вихід функції не вплине кодування.


вгору, саме це я і прагну.
Kemo

1
subject->verb(object), полегшує запам'ятовування порядку параметрів.
Мінг-Тан

+1 Я розігрувався, створюючи власний клас рядків, щоб зробити подібні речі, це полегшує кодування набагато простіше, і ви ніколи не забудете впорядкування параметрів.
НезадоволенеЗакриття

2
То що б is_object($string)повернути? Це або перерве сумісність великого часу, або призведе до введення дійсно неінтуїтивних майже-але не зовсім-об'єктів.
Тгр

@Tgr: is_object () має бути застарілим - не повинно бути такого поняття, як "не об'єкт". За короткий термін це повинно бути властивістю ви можете вимкнути будь-який об'єкт, а конструктори рядків за замовчуванням вимкнуть його.
rjmunro

24

1) Я хотів би, щоб нещодавно створені об'єкти повернули "$ this", щоб я міг методом ланцюга, $ user = new User ('john') -> setLastName ('Doe') -> save ();

2) Якщо ви коли-небудь користувались рубіном та останнім часом вузлом, у них є чудова інтерактивна оболонка (IRB). Я хотів би, щоб PHP мав такий, який був насправді корисний.

3) Риси / Міксини, але я чую, що вони в дорозі.

4) я хочу вторити короткий масив $ myArray = ['мій', 'масив'];

5) Послідовне найменування / порядок (тобто голка стога сіна)


Я ненавиджу створювати create()метод, який не робить нічого особливого, аби обійти №1!
Алан Пірс

Я роблю те саме, але, використовуючи пізнє статичне прив'язування та об’єктний надклас, таким чином, кожен клас, який розширює мій суперклас, має метод, наприклад: SomceClass розширює SuperObject {}; SomeClass :: create () -> somemethod ();
герцогство, яке відбулося

Погляньте на github.com/philsturgeon/php-ps Це лише початок, але з деякою допомогою це може бути дуже корисно.
Філ Стерджон

1
Також є пакет PEAR, який пропонує інтерактивну оболонку для кодування швидких експериментів у PHP - доступний на pear.php.net/package/PHP_Shell
kguest

(новий Foo ()) -> bar () є частиною 5.4. 3) і 4) теж.
StasM

20

1) будь ласка, позбавтеся від include () Посилання на інші файли повинні бути посиланнями, а фактично не розміщувати вміст одного файлу вихідного коду в інший. Занадто багато PHP-програмістів використовують () як тип виклику функції, а не як засіб посилання на бібліотеку. Це призводить до різного роду неоднозначностей у змінному стані та нестабільному коді. Замініть це на Perl-подібну команду 'use'.

2) Будь ласка, надайте нестандартний спосіб компіляції програми PHP в єдиний розподільний файл байтового коду або виконуваний файл. Це значно підвищить привабливість PHP як комерційної мови розвитку. Це має бути базовим компонентом мови. Не хвилюйтесь про HTML-файли, які використовуються для GUI програми, тому що ...

3) будь ласка, позбудьтесь можливості вбудовувати теги PHP у HTML. Або хоча б забезпечити режим "без вбудовування". Це абсолютний безлад і заохочує поганий дизайн, змішуючи логіку програми та презентацію разом. Розробники повинні використовувати шаблони для відображення, а не плескати файли PHP разом і сподіватися на найкраще.

Підписано,

ГрандмайстерB

ps: не слухайте, що тут говорять інші, мені було приємно весь рік


37
1). Включає великі. Все, що включає, включає. 2). Це добре. 3) Шаблонування - найсильніша особливість PHP . Змусити вас використовувати якесь інше шаблонне глупство було б дуже поганим кроком.
Джош К

8
Мені подобаються (1) і (2), але (3) здається ретроградним кроком. PHP надає вам шаблону силу, від вас залежить, розумно ви її використовуєте чи ні.
geekbrit

11
3 немає сенсу - вбудовувати теги потрібно для будь-якого V в рамках MVC.
Олексій

9
Я читаю цю відповідь як "Шановний Санта, будь ласка, зробіть, щоб PHP не був PHP".
Стівен

1
3 прямо не виходить, оскільки PHP - це шаблонна мова.
Андрій

18

Ini директива E_ERRORщодо невизначених констант, а не припускати, що це рядок із E_NOTICE.


1
Константи класу роблять це, btw.
StasM

4
Серйозно я не розумію, чому вони змушують PHP приймати рядки без котирування. Це найглупіша річ коли-небудь. Я вибрав би E_ERRORабо E_PARSE.
BoltClock

14

Нормалізуйте глобальний простір імен за допомогою продуманої конвенції про іменування, яка має сенс для новачків!

Цитувати нашого улюбленого Джеффа Етвуда: PHP смокче, але це не має значення !


1
Я в принципі згоден, але поняття не маю, як це зробити на практиці :)
StasM

3
@StasM: Я думаю, що першим кроком було б зробити нові версії бібліотек простірними і дозволити програмістам (через налаштування ini) відключити поточні глобальні бібліотеки. Я думаю, що пакет сумісності буде для того, щоб використовувати старіші версії, але писати це не повинно.
Michał T


13

1) Коротший синтаксис масиву / об’єкта, a la JavaScript (як було зазначено раніше)

2) Дозволити constзмінним дозволити результат обчислення, як define()це робиться.

3) Ланцюг прямо від конструктора: new User()->name('Ryan');

4) Перенаправлення масиву: something_that_returns_array()[4];

5) Розширена підтримка SPL. SPL виконує гідну роботу з переосмислення функцій рядків та масивів (серед іншого) як об'єктів. Розширення SPL могло б вирішити чимало зусиль щодо того, що мова є такою прискіпливою.

6) Використання ArrayObject()повинно бути таким же прозорим, як і використання array(). Ви повинні вміти робити такі речі, як array_filter($array_object_instance)не роблячи array_filter($array_object_instance->getArrayCopy()). Ще краще, звичайно, було б $array_object_instance->filter().

7) Повноцінне Unicode було б непогано.

8) Перестаньте робити дивні автоматичні перетворення типу. Наприклад, ви не повинні мати можливість echoоб’єкта SimpleXMLElement, попередньо не набравши його якраз як рядок. Або, принаймні, кидайте щось, коли це відбувається (наприклад, у суворому режимі чи в будь-якому іншому режимі error_reporting(-1)).

9) Підтримка або декількох потоків, або якихось парних / асинхронних зворотних викликів. Це найбільше важливо при спробі завантажувати великі файли через CURL. Замість старовинних ниток, було б непогано щось на зразок Apple Grand Central Dispatch. Або навіть щось схоже на JavaScript, де ви можете робити запити асинхронізації та визначати зворотні дзвінки.

10) Послідовне називання / порядок (тобто голковий стог) було б непогано, але я думаю, що це можна було б краще вирішити за допомогою SPL.

11) Офіційно підтримувана інтерактивна оболонка PHP, як IRB. У Facebook є один дзвінок, phpshякий був написаний на Python, але йому не вистачає польської мови, яку я хотів би бачити.

12) Для API Reflection додайте підтримку коментарів (a) docblock на константи (глобальний та клас) та (b) підтримку для розбору коментарів, схожих на PHPDoc, у розумну структуру даних. Є пакет PECL під назвою "docblock", який намагається це зробити, але не здається, що автор зайшов дуже далеко.

EDIT: 13) Я також хотів би бачити можливість використання !та ?в назвах функцій - як Ruby can.


Я погоджуюся, що arrayobject повинен підтримуватися для функції array_ *. але який би був очікуваний результат для чогось типу "array_merge", якщо врахувати підкласи arrayobject. вам дозволялося б лише об'єднати екземпляри одного класу, і що поверне array_merge? php масив чи екземпляр arrayobject (відповідно, це підклас)?
Харальд

Я б стверджував, що оскільки дані внутрішньо є масивом, і ArrayObject завершує це з функціональністю, то навіть підкласи ArrayObject все одно будуть працювати з масивами всередині. Я б очікував, що зможу об'єднати інший стандартний масив або ArrayObject (або підклас). Що стосується того, що воно повернеться, я стверджую, що він також повинен повернути новий ArrayObject, але дотримуйтесь прецеденту, встановленому simplexml_load_string (), де ви можете вказати ім'я класу, для якого результат повинен бути екземпляром.
Райан Парман

12

1) Поняття масиву в стилі розуміння списку Python:

$newlist = array($x->something for $x in $oldlist);

//with short array syntax:
$newlist = [$x->something for $x in $oldlist];

2) Синтаксис короткого масиву

$newlist = [1,2,3,4,...];

3) Зробіть порожнім (), не вважайте рядок "0" істинним


2
Я думаю, що для (1) щось приготоване з ітератора та закриття було б краще.
StasM

+1 IMHO, це має бути включено до всіх мов, а також до ітераторів. Вони просто спосіб корисного не мати.
Еван Плейс

empty()є логічною протилежністю if ($x), тому має сенс, що empty('0')це правда, бо if ('0')неправда. Єдина відмінність - empty()не кидати повідомлення, якщо змінна не встановлена.
Андрій

12

Я хотів би бачити законний метод створення / визначення масивів CONSTANT. Існує кілька шахрайських способів імітувати такий функціонал, але було б непогано, якби це була просто пряма особливість PHP. Було б добре, якби ви могли створити масив таким чином, який схожий на "остаточне" оголошення Java.

Я створив систему входу, яку дуже швидко налаштувати. Все, що вам потрібно зробити - це змінити вміст масиву в текстовому файлі, щоб вказати потрібні поля для інформації про користувача. Використовуючи низку циклів, вона обробляє все, починаючи з генерації форми та сенсибілізації введення, до викликів бази даних, але все залежить від цього вихідного масиву.

Файл із масивом заблокований з дозволами, але як тільки масив переміщається в ефірі, він змінюється. Хоча я вважаю, що система досить захищена, мені не подобається залишати щось випадковості. Метод для доопрацювання масивів був би приємний для такої ситуації.

Нова ідея !!

Ох, я придумав щось інше, що мені б дуже хотілося в php. Мені б хотілося, щоб якась система контролювала операції з файловими файлами PHP та операціями з каталогами, аналогічно тому, як працює .htaccess.

Файл .phpaccess повинен викликати якусь ту саму політику домену / тієї самої джерела.

Наприклад, якщо я розміщував багато сайтів з віртуальними хостами, я міг би мати файл .phpaccess у каталозі, який би вказав php перевірити походження виконуваних сценаріїв, які намагаються працювати в моєму захищеному каталозі. Якщо скрипт не прийшов з цього каталогу або його підкаталогів, файлові операції / або операції з сокетом буде відхилено.

Я думаю, що така система зробить віртуальний хостинг набагато безпечнішим середовищем. Якщо ви можете розмістити одну з них у верхній частині кожного віртуального хоста, це зменшить шанс того, що хтось знайде спосіб проникнути у сусіднього віртуального хоста.

Крім того, якщо було б добре мати спосіб її закріплення в зворотному порядку. тобто обмеження досяжності скриптів в одному каталозі до цього каталогу.

Його інь і янь знаєте!


+1 для final. Для уточнення: finalозначає, що значення змінної можна встановити під час виконання (на відміну від констант, які повинні бути постійними виразами), але можна встановити лише один раз. Див. Також C # 's readonly.
Давидтбернал

1
є пропозиція щодо геттерів / сеттерів для магістралі, які б швидко витісняли читання тощо. Незмінні масиви, хоча, ймовірно, це буде важко зробити.
StasM

Після phpaccess, PHP вже має "безпечний режим", який робить те, що ви описуєте.
НезадоволенняЗакрито

11

Мої два найбільші побажання як хардкор PHP-програміста:

  1. Підтримка нарешті. Великий безлад вимислено обійти це через прапори чи подібні засоби.
  2. Я хотів би побачити підтримку в синтаксисі C # для геттерів та сеттерів. Коли у вас є багато геттерів і сеттерів, простий синтаксис, такий як C # 's, - це чудовий підсилювач продуктивності, а не робити це способом Java і писати геттер і сетер-методи. Магічні методи приголомшливі в тих випадках, коли ви хочете динамічно створювати членів (наприклад, якщо ви хочете надати рендереру шаблону деякі змінні для використання), але вони не корисні для звичайних властивостей, на яких ви хочете, щоб IDE автозаповнюється, знайте їх типи тощо. це допоможе зробити код меншим і все ще таким же читабельним та простим у використанні.

1
1. На жаль, це важко зробити, але, безумовно, хороший пункт 2. Wiki.php.net/rfc/propertygetsetsyntax
StasM

@StasM: як щодо цього через анотації? Щось у напрямку: / ** @get getFoo; @set setFoo; * / приватний $ foo;
Michał T

9

Синтаксис мови : у pihipi та phpreboot є цікаві підказки того, що цікавить розробників (хоча phpreboot занадто далеко стає JS).

Методологія розробки : Це значно збільшило б тривалість життя PHP.net, якби такі опитування були фактично враховані. Не прийміть більше вольово-нехотячих післяобідніх синтаксичних рішень сеансу IRC.

Індивідуальні особливості : Деякі були згадані раніше, але я щасливо спалю карму, щоб тут бути додатково тупим:

  • Тип рядка Unicode
  • Біґінт (див. Пітон).
  • Runkit вбудований для видалення / перейменування / заміщення вбудованих функцій та класів, які не завжди є настільки добре розробленими.
  • Сучасний ООП
    • багаторазове успадкування (замість складності підтримувати рідко крайові випадки із синтаксисом незграбних рис)
    • скаляри можуть подвоюватися як об'єкти (див. Python), наприклад, array () працює як ArrayObject, або рядки як SplString (потрібні застосовні методи, усі рядкові функції повинні бути доступними як str::toupper())
  • Знищити \синтаксис простору іменного лайна , виправити аналізатор та прийняти ::як альтернативу. Знаєте, як справжня мова.
  • Будь-яка варіація LINQ (хоча я не вірю, що ви, хлопці, розробляєте розумний синтаксис)
  • або XML-літерали.
  • Позбавтеся від поведінки часу виконання і семантичних перемикань php.ini. Це викликає деяке хвилювання, правда, але принесе користь розробникам та базі користувачів.
  • Так, магічні котирування ще не зникли.
  • Перетворити байт-код Zend Engine в PBC

Хоча, якщо це не очевидно, я б із задоволенням фінансував когось іншого, щоб зробити це останнє, і вбити php.net як основну реалізацію. :P
О, щойно помітили, це вікі спільноти. Тож є ймовірність, що ти насправді не заради карми, а справжній інтерес. Якщо так, погляньте на <b> випуск </b>, який серйозно шкодить мові (режиміт).


5
Я ненавиджу синтаксис \ простір імен, але це довга і сумна історія, чому це стало так, і він, ймовірно, не зміниться ... Напевно, якби я міг змінити лише одне в PHP, яке було б моїм основним кандидатом. Але це те, що воно є.
StasM

@StasM: Дякую за відгук і вибачте за грубість щодо деяких речей PHP, але мені все одно про PHP; отже, дуже впевнено. - Я трохи прочитав про міркування. Дилема зворотного нахилу ще не дуже важлива проблема, але вона стане наступного року, коли бібліотеки поширюватимуться. Тож сподіваюся, що хтось пише аналізатор, який переписує \ груз \ культ \ клас \ імена назад у схеми підкреслення.
Маріо

Можливо, я зухвалий, але яка різниця в тому, що ми використовуємо '::' або '\' для просторів імен?
Michał T

@Pies: Це ::було б більш природно для будь-якої близької мови синтаксису C / C ++. І `\` є не тільки ненормальним серед усіх мов програмування, але має неперевірені конотації. Деякий попереднє обговорення: stackoverflow.com/questions/238550 / ... або developers.slashdot.org/article.pl?sid=08/10/26/1610259 і reddit.com/r/programming/comments/79cut / ... - Але в зокрема вирішення цього питання без зворотного зв’язку та сигналізації спільноти розробників відсмоктувати його не було дуже бажаним кроком.
Маріо

1
+ 1000000 для багаторазового успадкування.
ts01

8

Я хотів би бачити об'єднання Помилок та Винятків у єдине поняття (Винятки). Чудово вміти ловити винятки і записувати їх у журнал, таким чином знаходити та виправляти помилки. Але якщо є щось принципово неправильне (читайте: Помилка PHP) у кодовій доріжці, яка дуже рідко потрапляє, немає жодного хорошого способу перевести цю інформацію в ту саму базу питань.

Будь ласка, Санта, введіть перемикач у php.ini, який би робив усі помилки винятками - в ідеалі, винятки, які я можу зафіксувати у своєму коді.


1
У цьому двигуні вже є підтримка, і багато розширень використовують його. Ви також можете легко зробити це за допомогою set_error_handler () та ErrorException. Остерігайтеся E_STRICT / E_NOTICE / E_DEPRECATED, хоча ...
StasM

Я добре знаю ці методи, і вони справді хакі. Я б хотів уніфікований спосіб - той, який включає E_STRICT / E_NOTICE і подібне.
Олексій

7

PHP мені добре підходить, як і для збивання невеликих та середніх веб-сайтів; Я повинен бути трохи не фантастичним, єдине, що я міг би сприймати як відповідь на це питання, це те, що робить його кращим масштабом для сайтів з високим трафіком.

Я думаю, що стосується нерестування процесів до інших ядер, наприклад, оновлення бази даних в одному процесі під час створення вихідної сторінки в іншому. Швидкий пошук Google вказує на те, що це може бути імітовано, але в даний час не підтримується безпосередньо в php.


1
Насправді, думати про це більше, видалення бази даних здається цікавим сценарієм, тому +1 про це :)
StasM

1
@Stasm, я припускаю, що ви маєте на увазі, що окремі запити виконуються як окремі процеси. Я говорю про складну сторінку, яка потребує генерації сторінки та обчислення фону. Я можу помилитися, але я не думаю, що існує спосіб нерестувати (наприклад) операції по оновленню бази даних в окремий процес. Причиною цього було б швидше відправити сторінку запитувачу, а не чекати, коли вся обробка, яка не пов'язана безпосередньо із створенням сторінки, завершиться послідовно. PS .. Дякую за оновлення!
geekbrit

7

Я дійсно пропустив, що скалярні типи не трактуються як об'єкти, а реальні об'єкти не можуть діяти як будь-який інший тип або об'єкт (крім рядка через __toString ()).


Так, магічні методи для набору тексту, будь ласка.
Michał T

7
  • підтримка перерахувань (наприклад, java 1.5+)
  • Вміти визначати типи повернення методів в інтерфейсах та класах
  • підтримка анотацій / визначення метаданих про властивості та методи.
  • вміти робити строгий натяк на тип скалярних аргументів методу.

+1 Як я хотів би бачити всі ці речі в PHP.
Джеремі

6

Очистіть "Примітки, внесені користувачем" на http://php.net . Іноді вони справжній безлад, але в цілому є великою цінністю.


1
Якийсь функціонал голосування вгору / вниз та можливість посилання на оригінальний коментар у відповіді, безумовно, було б добре.
Тгр

5

У PHP є кілька досить пристойних функцій масиву, що забезпечують обробку списку, зворотними дзвінками та create_function()базовим обчисленням лямбда.

Основна проблема з цим полягає в тому, що це дуже багатослівно в PHP, скорочена система була б чудовою, особливо, коли мова йде про команди / зменшення команд.

Що ще важливіше, перелік функцій не зовсім завершений:

  • немає foldrфункції, array_reduce()забезпечуєfoldl
  • array_map()повинен передати ключ у другому аргументі, як і array_walk()це
  • array_map_keys()може бути корисним для ключових змін
  • список розуміння дуже незграбне, range(), array_fill()і array_fill_keys()обробляти тільки так багато справ, і array_filter()окремо

Я не маю на меті вносити PHP в Haskell, але PHP часто використовується для маніпулювання структурою типів списків, і наявність у цьому плані повного набору інструментів було б корисно.


1
Мій колега також вважає, що можуть / повинні бути деякі інші доповнення для переліку функцій, пов’язаних із масивом; при згадці в його акаунті github: Це відсутність array_all () та array_any (), які перевіряють, чи * умова, представлена ​​зворотним викликом, має значення для всіх або будь-яких елементів масиву. gist.github.com/44350
kguest

5

Перевантаження оператора:

$result = $MatrixA + $MatrixB * $MatrixC;

1
Не впевнений, наскільки добре це буде натискати, коли PHP є динамічно набраною мовою.
BoltClock

5
Можливо, це слід робити за допомогою магічних методів, як __add ($ obj), __times ($ obj) тощо.
Michał T

він уже існує як PECL ext: pecl.php.net/package/operator . Не повинно бути занадто багато роботи, щоб злити його з головним джерелом
Xananax

4

Додайте винятки замість створення E_WARNING ... Дуже дратує, що я не можу використовувати щось таке, як:

try{
   $f = fopen('asd', 'r');
   flock($f, LOCK_SH);

   while(!feof($f)){
       echo fread($f, 512);
   }

   fclose($f);

}catch(IOException $ex){
   echo 'Oops, something wrong: '.$ex->getCode();
}

Звичайно, наразі це не так вже й практично, але отримувати:

УВАГА

УВАГА

УВАГА

і я не можу контролювати потік коду, не записуючи власний error_handler та рядкове обнюхування, яка була створена помилка (дозвіл, неправильне ім'я файлу чи щось інше; я не заперечую про інші джерела помилок тут), щоб викинути правильне виключення .

Я сподіваюся, що не маю пояснити, чому це важливо.

PHP перетворився на об'єктно-орієнтовану кількість часу тому, і ми, програмісти, які використовують PHP, з нетерпінням чекаємо можливостей OO, не запроваджуючи "goto" ... Коли я дізнався, що це справді трапляється, я подумав, що це день першотравневого дурня.


Якщо не буде спійманий, виняток вбиває сценарій. Попередження на виробничому сервері буде зареєстровано та ніколи не відображатиметься користувачеві. Якщо змінити цю функціональність зараз, це призведе до розбиття багатьох сценаріїв, оскільки вони не розроблені для того, щоб їх зрозуміти. (Зауважте, що я пишу обробники помилок, щоб самому кидати винятки). Тепер, PDO може викинути попередження або винятки: програміст вирішує під час виконання. Цей функціонал, мабуть, такий, який слід додати до більшості модулів.
Reece45

4
  1. Консолідуйте модель об'єкта - змусьте всі об'єкти розширити базовий клас об'єктів. Клас Object (крім усього іншого) реалізував би всі магічні методи (щоб вони більше не були магічними!)

  2. Перемістіть розширення до власних просторів імен - відключіть глобальний простір імен $conn = new \MySQLi\Connection();

  3. Відключіть spl_autoload()функцію! Якщо серйозно, це, можливо, одна з найбільших особливостей PHP, а також найкорисніша водночас. spl_autoload- це автозавантажувач за замовчуванням, який підтримує простори імен та декілька розширень файлів, але з незрозумілої причини потрібні назви файлів з нижчим регістром. Для цього заповнено звіт про помилки , але персонал відповів, що не виправить це через відсталу сумісність. Так ... це не так, як кожен фреймворк постачається з власним автозавантажувачем, оскільки за замовчуванням його калік!



4

Доведіть підтримку taint до останньої версії та включіть її у стандартні збірки, бажано увімкнено у конфігурації за замовчуванням http://wiki.php.net/rfc/taint

Це дозволить запобігти атакам ін'єкцій XSS та SQL, змусивши людей правильно кодувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.