Статьи

PHP6 получает оператор COMEFROM

Одним из наиболее спорных дополнений в PHP6 является GOTO . Некоторые утверждают, что это идет вразрез с многолетним здравым смыслом программирования, но существуют допустимые случаи использования, когда выполняются критически важные для производительности операции, такие как синтаксический анализ, когда накладные расходы на вызовы пользовательских функций PHP становятся значительными.

В любом случае, GOTO похоже, открыл ворота для более радикальных модификаций языка, а недавнее обсуждение вращалось вокруг добавления оператора COMEFROM в PHP, что привело к первоначальному патчу, примененному здесь к ветви PHPS CVS.

Прецедент для COMEFROM можно найти в INTERCAL , языке, который по разным причинам никогда не затрагивает основной поток, но нацелен на то, чтобы стать лучшим LISP , как показано в этом листинге кода .

Подобно GOTO , COMEFROM может привести к spagetti, если его использовать неразумно, поэтому первоначальная реализация накладывает разумное ограничение на его использование: вы можете использовать только COMEFROM PHP-скрипт, который не является сценарием, в котором использовался COMEFROM . Пример, если у меня есть некоторые, как включить файл;

<?php // login.php - the script we want to COMEFROM function login($username, $password) { $auth = new Auth(); return $auth->isValidUser($username, $password); }
<?php // login.php - the script we want to COMEFROM function login($username, $password) { $auth = new Auth(); return $auth->isValidUser($username, $password); } 

Я могу сделать это с помощью COMEFROM;

<?php // index.php require_once 'login.php'; class MyAuth implements LoginHandler { // Some other implementation providing the same interface function login($username, $password) { // authenticate against, say, an LDAP server } } // Execute a COMEFROM, replacing use of Auth class with MyAuth COMEFROM 'login.php:3' [ $auth = new MyAuth(); return $auth->isValidUser($username, $password); ] if ( login($_POST['username'], $_POST['password'] )) { echo "You are logged in<br />"; }
<?php // index.php require_once 'login.php'; class MyAuth implements LoginHandler { // Some other implementation providing the same interface function login($username, $password) { // authenticate against, say, an LDAP server } } // Execute a COMEFROM, replacing use of Auth class with MyAuth COMEFROM 'login.php:3' [ $auth = new MyAuth(); return $auth->isValidUser($username, $password); ] if ( login($_POST['username'], $_POST['password'] )) { echo "You are logged in<br />"; } 

Как показывает приведенный выше код, это дает вам возможность переопределить поведение кода без необходимости его физического изменения или беспокойства о таких вещах, как динамические включения. Этот тривиальный пример не иллюстрирует некоторые из более продвинутых возможностей COMEFROM , таких как функциональное программирование, макросы и Ruby-подобные «блоки», которые делают PHP значительно более динамичным. Тем не менее, в настоящий момент я вижу, что мне не хватает способа возврата обратно в код, который у вас есть COMEFROM , который позволил бы реализовать такие вещи, как чрезвычайно быстрая реализация AOP — возможно, GOTO можно было бы расширить для поддержки этого?

В любом случае — это может быть функция, которая стимулирует спрос на хосты для перехода на PHP?