假设的连接困境

时间:2011-11-27 06:30:27

标签: php string concatenation

所以我正在研究PHP的简单微语言/替代语法。 它的语法需要很多JavaScript和CoffeeScript,包括我自己的一些概念。我在PHP中亲手编写了解析器(没有使用解析器生成器)来将代码转换为PHP然后执行它。它更像是一个概念/学习工具的证明,而不是其他任何东西,但如果我说我不想在某一天看到它用于实际项目,我会撒谎。

无论如何,这是我遇到的一个小问题,我认为我会强加给你很好的智慧:

正如您在PHP中所知,句点(。)用于字符串连接。但是在JavaScript中,它用于方法链接。

现在有一件让我烦恼的事情就是不得不对我的方法链使用那个血腥箭头( - >),所以我采用了JavaScript的方式并实现了句点(。)以便与对象一起使用。

(我认为你已经可以看到问题了)

因为我目前只编写一个仅仅进行大量搜索和替换的“哑”解析器,所以无法区分句点(。)是用于连接还是用于方法链接。

“所以如果你想尝试像JavaScript一样,只需使用加法(+)运算符Franky!”,我听到你尖叫。好吧,我会,但因为加法(+)运算符用于PHP中的数学,我只会把自己置于相同的情况。

除非我能够使我的解析器足够智能(带有废话加载工作)才能知道当加法(+)运算符使用整数时,不要将它转换为句点(。)以进行连接我很漂亮搞砸了。

但这是很酷的事情。因为这几乎是一种新语言。我不必使用句点或加法运算符进行连接。

所以我的问题是:如果我决定引入一种新的字符串连接方法,哪种字符最有意义?

3 个答案:

答案 0 :(得分:2)

是否必须是一个角色? ..可以正常工作!

无数组合,例如~~>:甚至!

答案 1 :(得分:1)

如果您不想使用+或。,那么我会推荐^,因为它在其他一些语言中用于字符串连接,我不相信它用于PHP中的任何内容。 编辑:有人指出它用于XOR。一种选择是使用^无论如何,因为按位XOR不常用,然后将像^^这样的其他内容映射到XOR。另一种选择是使用..进行连接。问题是大部分字符都是采用的。

另一种选择是使用+,但将其映射到一个函数,该函数在一个参数是字符串时连接,否则添加。为了不破坏依赖于被视为数字的字符串的事物,我们应该将数字字符串视为用于这些目的的数字。这是我将使用的功能。

function smart_add($arg1,$arg2) {
    if ($arg1.is_numeric() && $arg2.is_numeric()) {
        return $arg1 + $arg2;
    } else {
        return $arg1 . $arg2;
    }
}

然后a + b + c + d变成了smart_add(smart_add(smart_add(a,b),c),d)

这在所有情况下可能并不完美,但它应该在大多数情况下都能很好地运作,并且有明确的使用规则。

答案 2 :(得分:1)

  

所以我的问题是:如果我决定引入一种新的方法   字符串连接,哪个字符最有意义?

如您所知,您需要选择一个未被用作PHP operators之一的角色。由于字符串连接是一种常用技术,我会尽量避免使用您需要按SHIFT键入的字符,因为这些字符将成为障碍。

可能你应该为字符串连接(或者你需要用不同的运算符覆盖的任何其他操作)定义自己的语法,而不是尝试为字符串连接分配一个字符,作为简写运营商(有点)。类似的东西:

[$string, $string]

解析器应该很容易获取并形成生成的连接字符串。

编辑:我还应该注意,无论你是使用文字字符串还是变量,都没办法(据我所知)将此语法与任何其他PHP功能混淆,因为逗号中间对于数组操作无效。因此,以下所有内容仍将被识别为字符串连接,而不是PHP中的其他

["stack", "overflow"]
["stack", $overflow]
[$stack, $overflow]

编辑:由于这与JSON表示法冲突,因此存在以下备选变体:

  1. 更改分隔符
  2. 省略分隔符
  3. 示例:

    [$stack $overflow $string $concatenation] // Use nothing (but really need space)