2015-01-11 2 views
2

Я недавно начал с изучения Swift для разработки iOS. У меня есть опыт работы на языках сценариев, особенно PHP. Увидев, что это подчеркнуто с помощью let, чтобы определить константу в пользу var, чтобы компилятор оптимизировал полученный код, я подумал: есть ли эквивалент для PHP? Или это просто не применяется, поскольку PHP не статически компилируется?Есть ли эквивалент «let» против «var» в PHP?

Я попробовал удачу при поиске, но не нашел удовлетворительной информации по этому вопросу.

+0

[РНР константы] (http://php.net/manual/en/ language.constants.php), которые определяются через 'define ('CONSTNAME', 'constant value')' или через 'const CONSTNAME = 'постоянное значение' [в классе] (http://php.net/manual/ ен/language.constants.php). Это то, что вы хотели знать? –

+3

@MichaelBerkowski Изгнанная номенклатура от Apple aisde, 'let' переменные не являются константами, они являются неизменяемыми переменными. Они инициализируются во время выполнения, в точке, где определение отображается (и потенциально более одного раза, если блок, в котором они определены, повторно введен). – hobbs

+0

Например, если 'x' является параметром функции,' let y = x + 1' является полностью законным и будет давать 'y' другое значение при каждом вызове функции (но он не может быть переназначен внутри функции) , – hobbs

ответ

4

Нет, вы не можете иметь локально ограниченные константы в PHP. Все PHP-константы всегда отображаются глобально. Также нет понятия, как неизменяемые/изменяемые переменные.

Вы можете реализовать неизменяемые объекты (PHP: immutable public member fields), но это совсем другое.

На самом деле есть const ключевого слова в языке, но документы говорят:

Примечание:

В отличии от определения констант с помощью определения(), константы определяются с помощью константного ключевого слова должны объявляются в области верхнего уровня, потому что они определены во время компиляции. Это означает, что они не могут быть объявлены внутри функций, циклов, операторов if или try/catch.

(от http://php.net/manual/en/language.constants.syntax.php)

Интерпретированных языков с динамическими системами типа может иметь что-то вроде быстрой let заявления, так что это не потому, что быстрый компилируются и PHP интерпретируется (например, есть предложение javascript, чтобы ввести эту функцию: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/const)

+0

Спасибо за информацию. Далее, я хотел бы узнать, существуют ли в PHP неизменные переменные. – herrbischoff

0

Есть ли эквивалент «let» vs. var в PHP?

PHP не имеет let как особенность родного языка, но (как текущей версии 7.1.4 - 04/2017)

Но, некоторые расширения высокопроизводительные как Phalcon и Ice имеют поддержку let, из-за базового использования zephir-lang. Итак, есть let, но косвенно; используя вышеупомянутые расширения.

Есть два варианта использования:


В качестве примера посмотрите на источник для Ice Router:

namespace Ice\Mvc\Route; 

use Ice\Mvc\Route\Parser\ParserInterface; 
use Ice\Mvc\Route\DataGenerator\DataGeneratorInterface; 
use Ice\Mvc\Route\Parser\Std; 
use Ice\Mvc\Route\DataGenerator\GroupCount as Generator; 

class Collector 
{ 

    private routeParser { set }; 
    private dataGenerator { set }; 

    /** 
    * Constructs a route collector. 
    * 
    * @param RouteParser $routeParser 
    * @param DataGenerator $dataGenerator 
    */ 
    public function __construct(<ParserInterface> routeParser = null, <DataGeneratorInterface> dataGenerator = null) 
    { 
     if !routeParser { 
      let routeParser = new Std(); 
     } 

     if !dataGenerator { 
      let dataGenerator = new Generator(); 
     } 

     let this->routeParser = routeParser, 
      this->dataGenerator = dataGenerator; 
    } 

    /** 
    * Adds a route to the collection. 
    * 
    * The syntax used in the $route string depends on the used route parser. 
    * 
    * @param string|array $httpMethod 
    * @param string $route 
    * @param mixed $handler 
    */ 
    public function addRoute(var httpMethod, string route, handler = null) 
    { 
     var routeDatas, routeData, method; 

     let routeDatas = this->routeParser->parse(route); 

     if typeof httpMethod == "string" { 
      let method = httpMethod, 
       httpMethod = [method]; 
     } 

     for method in httpMethod { 
      for routeData in routeDatas { 
       this->dataGenerator->addRoute(method, routeData, handler); 
      } 
     } 
    } 

    /** 
    * Returns the collected route data, as provided by the data generator. 
    * 
    * @return array 
    */ 
    public function getData() 
    { 
     return this->dataGenerator->getData(); 
    } 
} 
Смежные вопросы