- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
(PHP有||
和OR
。JS只有||
。)
JS. 根据MDN ||
的优先级高于 =
。所以这是行不通的:
a || a = 1;
因为它被评估为:
(a || a) = 1;
这会导致“分配中的左侧无效”。我明白那个。这是有道理的。
PHP。 根据 PHP.net它对 PHP 的作用相同:||
在 =
之前。但是,我一直使用它:
$a || $a = 1;
为什么它在 PHP 中工作?最重要的是:PHP 的 OR
的优先级低于 =
,因此它们不应该做同样的事情:
$a || $a = 1;
$a OR $a = 1;
但他们确实... https://3v4l.org/UWXMd
我认为 JS 的 ||
是根据 MDN 的表工作的,而 PHP 的 OR
的工作方式类似于 PHP 的表,但是 PHP 的 ||
应该是'不像它那样工作。
这是另一个奇怪的 PHP 怪癖吗?
手册中还提到了这一点:
Although
=
has a lower precedence than most other operators, PHP will still allow expressions similar to the following:if (!$a = foo())
, in which case the return value offoo()
is put into$a
.
优先级表指示 PHP 应该计算 (!$a) = foo()
,这没有任何意义并且应该失败,但是 PHP 将它计算为 !($a = foo( ))
,因为它喜欢异常。
后续问题:您认为 if ( $d = $c && $e = $b && $f = $a )
会怎样? https://3v4l.org/3P2hN我不明白...我确实理解第二种和第三种情况(使用 和
),只是不理解第一种情况。
最佳答案
根据 zend_language_parser.y代码被解析为等同于 $a || ($a = 1)
和 $a or ($a = 1)
在每种情况下,分别。
正如 melpomene 总结的那样,赋值产生式不是表达式上的中缀二元运算符;相反,赋值运算符是受限产生式,其中左侧必须是变量
产生式。
根据 borrowed quote :
Thus PHP parses the expression in the only possible way..
关于优先级的文档正确..它适用。
因此 $a || $a = 1
遵循(反转)产生式:
variable "||" variable "=" expr
variable "||" expr_without_variable
expr "||" expr
expr
!$a = foo()
的情况类似,在遵循(反向)产生式后被解析为 !($a = foo())
:
"!" variable "=" expr
"!" expr_without_variable
"!" expr
expr
现在,$d = $c && $e = $b && $f = $a
怎么样?它不被解析为($d = $c) && ..
,即使&&
确实有一个优先级高于赋值。它实际上被解析为$d = ($c && ($e = ..))
等等,由精明的读者完成。
虽然可能不会随便注意到,但这种差异能够产生不同的结果:
$a = (($c = 1) && ($d = 0));
var_dump($a, $c, $d); // => false, 1, 0
$b = ($e = 1 && $f = 0); // => $b = ($e = (1 && ($f = 0)));
var_dump($b, $e, $f); // => false, false, 0
因此,在将赋值运算符与优先级更高的运算符混合使用时,通常应使用括号,尤其是当其结果可能不明确时。
尽管这最初看起来不一致,但它是一个定义明确的语法 - 但技术细节隐藏在一些相当外行的文档之后;并且这些规则与其他类似 C 语法的语言中的规则略有不同。文档中缺少官方 EBNF 也于事无补。
尽管有解析细节,$a || $a = ..
代码( 是有效且定义明确的语法)从评估的角度来看应该保持定义明确,因为“或”的左侧必须出现在由于guaranteed short-circuiting .
相比之下,在 JavaScript 中,a || a = 1
被解析为 (a || a) = 1
- 这在语法上也是“有效”代码 - 根据 ECMAScript Grammar Rules .然而,一个|| a
不会产生有效的引用规范类型,因此会抛出一个运行时 ReferenceError。
关于php - JS 与 PHP : assignment operator precedence when used with logical-or,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32672016/
我在 JavaScript 文件中运行 PHP,例如...... var = '';). 我需要使用 JavaScript 来扫描字符串中的 PHP 定界符(打开和关闭 PHP 的 )。 我已经知道使
我希望能够做这样的事情: php --determine-oldest-supported-php-version test.php 并得到这个输出: 7.2 也就是说,php 二进制检查 test.
我正在开发一个目前不使用任何框架的大型 php 站点。我的大问题是,随着时间的推移慢慢尝试将框架融入应用程序是否可取,例如在创建的新部件和更新的旧部件中? 比如所有的页面都是直接通过url服务的,有几
下面是我的源代码,我想在同一页面顶部的另一个 php 脚本中使用位于底部 php 脚本的变量 $r1。我需要一个简单的解决方案来解决这个问题。我想在代码中存在的更新查询中使用该变量。 $name)
我正在制作一个网站,根据不同的情况进行大量 PHP 重定向。就像这样...... header("Location: somesite.com/redirectedpage.php"); 为了安全起见
我有一个旧网站,我的 php 标签从 因为短标签已经显示出安全问题,并且在未来的版本中将不被支持。 关于php - 如何避免在 php 文件中写入
我有一个用 PHP 编写的配置文件,如下所示, 所以我想用PHP开发一个接口(interface),它可以编辑文件值,如$WEBPATH , $ACCOUNTPATH和 const值(value)观
我试图制作一个登录页面来学习基本的PHP,首先我希望我的独立PHP文件存储HTML文件的输入(带有表单),但是当我按下按钮时(触发POST到PHP脚本) )我一直收到令人不愉快的错误。 我已经搜索了S
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the max key size for an array in PHP? 正如标题所说,我想知道
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在 MySQL 数据库中有一个表,其中存储餐厅在每个工作日和时段提供的菜单。 表结构如下: i_type i_name i_cost i_day i_start i_
我有两页。 test1.php 和 test2.php。 我想做的就是在 test1.php 上点击提交,并将 test2.php 显示在 div 中。这实际上工作正常,但我需要向 test2.php
我得到了这个代码。我想通过textarea更新mysql。我在textarea中回显我的MySQL,但我不知道如何更新它,我应该把所有东西都放进去吗,因为_GET模式没有给我任何东西,我也尝试_GET
首先,我是 php 的新手,所以我仍在努力学习。我在 Wordpress 上创建了一个表单,我想将值插入一个表(data_test 表,我已经管理了),然后从 data_test 表中获取所有列(id
我有以下函数可以清理用户或网址的输入: function SanitizeString($var) { $var=stripslashes($var); $va
我有一个 html 页面,它使用 php 文件查询数据库,然后让用户登录,否则拒绝访问。我遇到的问题是它只是重定向到 php 文件的 url,并且从不对发生的事情提供反馈。这是我第一次使用 html、
我有一个页面充满了指向 pdf 的链接,我想跟踪哪些链接被单击。我以为我可以做如下的事情,但遇到了问题: query($sql); if($result){
我正在使用 从外部文本文件加载 HTML/PHP 代码 $f = fopen($filename, "r"); while ($line = fgets($f, 4096)) { print $l
我是一名优秀的程序员,十分优秀!