我对 PHP 处理变量赋值的方式有疑问。
我们有以下声明:
$myVariable = "value";
上述语句为变量$myVariable赋值,然后为其分配内存位置。
但是如果我们在上面的脚本中加入如下语句:
$secondVariable = $myVariable;
然后:
关于性能问题,建议避免重复值,如果值不会改变,则继续使用引用(C++,Dietel & Dietel 的名著 How to Program in C++)
但是 PHP 呢?我听说,刚刚听说,PHP 做了一些技巧并通过按引用调用而不是按值调用来管理此类重复 ($secondVariable = $myVarible),并且在某些更改发生之前不复制变量$secondVariable 之后进行复制。
结论:
$myVariable = "value";
$secondVariable = $myVariable;
在 C++ 中是这样的:
string myVariable = "value";
string secondVariable = &myVariable;
虽然我知道 PHP 是用 C 编写的,但 C++ 是 C 的近继承人。
谁能告诉我上面的结论是否正确,PHP 是否像这样管理变量,或者它不关心和像 C&C++ 一样在每个赋值时创建一个新的内存位置?
最佳答案
这有点不同。 您还可以在 PHP 中使用指向引用的指针:
$a = &$b ;
如果您修改 $a,您也会修改 $b(反之亦然),因为它与引用的内存地址相同。
当你这样做时:
$a = 'something' ;
$b = $a ;
$b 作为$a 的副本进行管理。两个变量都是独立的。但是,在您修改 $b(或 $a)之前,PHP 只存储对 $a 的引用。这就是为什么在您修改 $a 或 $b 之前,您只有一个数量的 RAM 被使用。
为了确定这一点,您可以使用函数“memory_get_usage”并进行测试:
[dcordel:~] master+ ± php /tmp/test-1.php
$aVar = str_repeat('a', 268435456);
$another = &$aVar ;
Mem : 256 Mo
[dcordel:~] master+ ± php /tmp/test-2.php
$aVar = str_repeat('a', 268435456);
$another = str_repeat('a', 268435456);
Mem : 512 Mo
[dcordel:~] master+ ± php /tmp/test-3.php
$aVar = str_repeat('a', 268435456);
$another = $aVar ;
//before
$another.= 'a' ;
//after
before update : Mem : 256 Mo
after update : Mem : 512 Mo
关于php - 关于PHP的变量call-by-value和call-value-reference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24576816/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
给定以下方法:defsome_method:valueend以下语句按我的预期工作:some_method||:other#=>:valuex=some_method||:other#=>:value但是下面语句的行为让我感到困惑:some_method=some_method||:other#=>:other它按预期创建了一个名为some_method的局部变量,随后对some_method的调用返回该局部变量的值。但为什么它分配:other而不是:value呢?我知道这可能不是一件明智的事情,并且可以看出它可能有多么模棱两可,但我认为应该在考虑作业之前评估作业的右侧...我已经在R
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
在我的系统中,我已经定义了STI。Dog继承自Animal,在animals表中有一个type列,其值为"Dog"。现在我想让SpecialDog继承自dog,只是为了在某些特殊情况下稍微修改一下行为。数据还是一样。我需要通过SpecialDog运行的所有查询,以返回数据库中类型为Dog的值。我的问题是因为我有一个type列,rails将WHERE"animals"."type"IN('SpecialDog')附加到我的查询中,所以我不能获取原始的Dog条目。所以我想要的是以某种方式覆盖rails在通过SpecialDog访问数据库时使用的值,使其表现得像Dog。有没有办法覆盖用于类型
当我创建一个Rails应用程序时,控制台:railsnewfoo我的代码可以使用字符串“foo”吗?puts"Yourapp'snameis"+app_name_bar 最佳答案 Rails.application.class将为您提供应用程序的全名(例如YourAppName::Application)。从那里您可以使用Rails.application.class.parent获取模块名称。 关于ruby-on-rails-应用程序的名称是否可以作为变量使用?,我们在StackOve