我最近开始学习Swift for iOS开发。我有脚本语言的背景,特别是PHP。看到强调使用let
定义一个有利于var
的常量来让编译器优化生成的代码,我想知道:PHP是否有等价物?或者它根本不适用,因为PHP没有静态编译?
我在搜索时尝试了运气,但在这一点上找不到令人满意的信息。
答案 0 :(得分:5)
不,您不能在PHP中使用本地范围的常量。所有PHP常量始终是全局可见的。也没有像immutable / mutable变量这样的概念。
您可以实现不可变对象成员(PHP: immutable public member fields),但这是另一回事。
实际上语言中有const
个关键字,但文档说:
注意:强>
与使用define()定义常量相反,使用const关键字定义的常量必须在顶级作用域声明,因为它们是在编译时定义的。这意味着它们不能在函数,循环,if语句或try / catch块中声明。
使用动态类型系统的解释语言可以具有类似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)
但是,Phalcon和Ice等一些高性能扩展程序支持let
,因为zephir-lang的基础用法。
所以,有let
,但间接;使用上述扩展名。
有两种用例:
define a variable in the local PHP symbol table,例如
// set variable $price in PHP
let name = "price";
let {name} = 10.2;
作为示例,请查看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();
}
}