我有两个功能
function c( &$x )
{
$x = 25;
echo 'c is called, x = ' . $x . PHP_EOL;
}
function b()
{
echo 'b is called'. PHP_EOL;
return 5;
}
然后我编写了下面的代码,正如我所期望的那样,它应该将 b() 的结果放入 $o,然后通过引用将 $o 传递给 c() 并将其设置为新值。它工作正常:
$o=b();
c( $o );
echo 'o is '.$o;
输出符合预期:
b is called c is called, x = 25 o is 25
但是如果我尝试在这样的函数调用中分配 $o 的值:
c( $o = b() );
echo 'o is '.$o;
我得到奇怪的输出
b is called c is called, x = 25 o is 5
函数调用的顺序仍然相同,但为什么 $o 没有改变,尽管它是通过引用传递的?如果在函数调用中赋值,PHP 是否强制按值传递参数?如果是,从哪个版本开始以这种方式工作?根据这条评论:http://www.php.net/manual/en/functions.arguments.php#71198 2006 年,它的运作方式有所不同。我的版本是5.3.6
最佳答案
这是我之前遇到的 Zend 引擎的一个限制,特别是在使用 socket_select()/stream_select() 时,它们都需要“array of资源”参数通过引用传递。能够在一行中分配要通过引用传递的变量的值会很好,但(目前)不可能做到这一点。
我之前看到它提到过(虽然现在我找不到位置,(它是 here )并且它可能不是权威的)PHP 中的任何表达式计算为表达式的右侧。我的意思是:
$a = 1;
$b = 2;
echo $a = $b;
这将回显 2,因为传递给 echo 语句的表达式计算表达式 $b 的右侧,这是 2。
当将表达式的结果传递给一个函数时,例如 c( $o = b() ); 您正在传递 $o = b(); 的结果; 到函数 c(),我的理解(虽然我可能是错的)表达式的结果被传递到函数中并且函数被执行,之前一个zval创建并分配给保存 $o,这种行为旨在减少内存消耗并在以这种方式嵌套函数时加快内部处理速度。这意味着您实际上并没有通过引用传递变量,您只是传递了 b() 产生的值 - 表达式的右侧 - 不能通过引用修改,因为它没有可变容器。
确实,如果您打开 E_STRICT 消息,您将看到以下错误:
Strict Standards: Only variables should be passed by reference in ...
...所以这种行为实际上是“设计使然”的。
关于如果在函数调用中分配了 var,PHP 将忽略通过引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9601698/
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL