2

作为我对 Zephir 的实验的一部分,我目前正在尝试使用 PHP PDO 来访问 MySQL 数据库。对于初学者,我发现一个相对无害的

$dbh = new PDO("mysql:host=localhost;dbname=dbn;","user","pwd");

在 Zephir 中翻译和使用时

var dbh = new PDO("mysql:host=localhost;dbname=dbn;","user","pwd");

Zephir 抛出异常

var dbh = new PDO
------------^

通过一些搜索我解决了这个问题 - new 是 Zephir 中的保留字,必须用 $new 替换。

var dbh = $new PDO("mysql:host=localhost;dbname=dbn;","user","pwd");

即刻产生

var dbh = $new PDO(
-----------------^

当我意识到我必须明确告诉 Zephir 使用 PDO 名称空间时,我解决了这个问题

use \PDO;
var dbh = $new \PDO::PDO(

现在,与

var dbh = $new \PDO::PDO("mysql:host=localhost;dbname=dbn","user","pwd");

我明白了

var dbh = $new \PDO::PDO(...,"user","pwd");
---------------------------------------------^

这对我来说毫无意义。

据我所知,Zephir 还太年轻,不能考虑完整移植一个工作 PHP 原型。但是,它看起来足以用于移植 PHP 应用程序的一些 CPU 密集型位,但缺少它的文档。例如,文档中没有任何地方说明使用数组的正确方法是

array myArray;
 let myArray = [1,2,...];

错过第一个列表,编译器抱怨无法变异。

对于我当前的 PDO 问题,显然还有其他问题,但我不知道它可能是什么。我非常感谢任何帮助。

4

1 回答 1

4

zephir 中的var关键字用于变量声明。如果您分配像字符串或数组这样的“简单”值,它将起作用。

您的示例的问题在于这new PDO(<arguments>)是一个表达式,其中var运算符不是正确的选择。所以你想要的是分配一个值。

变量默认是不可变的。(参见 zephir-lang.com)
这就是为什么你需要使用let操作符,这使得它们不可变并且能够解析表达式。

所以你需要使用varlet
喜欢var dbh; let dbh = new \PDO(<arguments>);

如果你这样做,它会起作用:)

于 2015-02-16T17:02:24.407 回答