是否有相同的" let" vs." var"用PHP?

时间:2015-01-11 19:34:58

标签: php swift

我最近开始学习Swift for iOS开发。我有脚本语言的背景,特别是PHP。看到强调使用let定义一个有利于var的常量来让编译器优化生成的代码,我想知道:PHP是否有等价物?或者它根本不适用,因为PHP没有静态编译?

我在搜索时尝试了运气,但在这一点上找不到令人满意的信息。

2 个答案:

答案 0 :(得分:5)

不,您不能在PHP中使用本地范围的常量。所有PHP常量始终是全局可见的。也没有像immutable / mutable变量这样的概念。

您可以实现不可变对象成员(PHP: immutable public member fields),但这是另一回事。

实际上语言中有const个关键字,但文档说:

  

注意:

     

与使用define()定义常量相反,使用const关键字定义的常量必须在顶级作用域声明,因为它们是在编译时定义的。这意味着它们不能在函数,循环,if语句或try / catch块中声明。

     

(来自http://php.net/manual/en/language.constants.syntax.php

使用动态类型系统的解释语言可以具有类似swift let语句的东西,所以这不是因为swift被编译并且PHP被解释(例如,有一个javascript建议引入该功能:https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/const

答案 1 :(得分:0)

  

PHP中是否存在“let”与“var”的对等关系?

PHP没有let作为母语功能,(截至当前版本7.1.4 - 04/2017)

但是,PhalconIce等一些高性能扩展程序支持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();
    }
}