我理解PHP中变量变量的概念.根据我对PHP 中变量变量的理解,下面的代码如下:
$foo = 'hello';
$$foo = 'world';
echo $foo . ' ' . $hello;
Run Code Online (Sandbox Code Playgroud)
将生成输出为:
Hello World
Run Code Online (Sandbox Code Playgroud)
但我发现很难理解变量对象属性的情况
假设我有一个名为foo的类,其中包含一个属性,如下所示:
class foo {
var $r = 'I am r.';
}
Run Code Online (Sandbox Code Playgroud)
现在,创建类foo的实例并使用以下代码的变量变量的概念:
$foo = new foo();
$bar = 'r';
echo $foo->$bar;
Run Code Online (Sandbox Code Playgroud)
将输出:
I am r.
Run Code Online (Sandbox Code Playgroud)
直到一切都很好,但是当我包含一个具有数组值的属性时,它会让我感到困惑.比方说,我将具有数组值的另一个属性添加到类foo,现在该类看起来像:
class foo {
var $arr = array('I am A.', 'I am B.', 'I am C.');
var $r = 'I am r.';
}
Run Code Online (Sandbox Code Playgroud)
现在当我创建类foo的实例并尝试读取属性$ arr [1]时 …
鉴于此类:
class Tacobell{
public function order_taco(){
echo "3 Tacos, thank you.";
}
public function order_burrito(){
echo "Cheesy bean and rice, please";
}
}
$lunch = new Tacobell;
$lunch->order_burrito();
$lunch->order_taco();
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
$myOrder = 'burrito';
$lunch->order_.$myOrder;
Run Code Online (Sandbox Code Playgroud)
显然代码是下铺 - 但显示我试图做的比试图解释它更好.
也许我说这一切都错了.我想到了一个带有switch语句的方法,传入burrito或taco,然后从那里调用正确的方法.但是我必须从头开始知道结束,并且我可能有很多方法,而且我不必每次都更新switch语句.
谢谢!
我想使用for循环打印这些变量:
<?php
$title1 = "TEXT1";
$title2 = "TEXT2";
$title3 = "TEXT3";
$title4 = "TEXT4";
$title5 = "TEXT5";
for ($i = 1; $i <= 10; $i++) {
echo "$title".$i; // I want this: TEXT1 TEXT2 TEXT3 TEXT4 TEXT5
}
?>
Run Code Online (Sandbox Code Playgroud) 有没有办法在python中使用变量字符串访问变量?例如,我想要比eval以下方式更简洁:
def toggleListButtons (self):
buttons = ["flip", "remove", "removeAll", "delete", "deleteAll", "loadDirectory"]
for button in buttons:
eval("self." + button + "Button.setEnabled(!self." + button + "Button.isEnabled())")
Run Code Online (Sandbox Code Playgroud) 看到了一些与此相关的答案,但没有人回答这个问题的主题.
请考虑以下事项:(linkto:jsfiddle)
$(function(){
arrKeys = [];
objArr = [];
nameArr = ['name1','name2','name3','name4'];
descArr = ['desc1','desc2','desc3','desc4'];
allValues = {name: nameArr, desc: descArr};
arrKeys[0] = 'name';
arrKeys[1] = 'desc';
first = arrKeys.shift(); // returns 'name'
$(allValues[first]).each(function (key,value) {
console.log(first); //returns 'name'
objArr[key] = {first:value}; //the problem
});
console.log(objArr);
});
Run Code Online (Sandbox Code Playgroud)
使用console.log(objArr)生成以下对象数组,如下所示:
[对象,对象,对象] 0:对象 优先:"name1"1:对象 优先:"name2"2:对象 优先:"name3"3:对象 优先:"name4"长度:4
问题是我希望属性"first"成为var first的值(这是"name"..所以相反,结果将是:
[对象,对象,对象] 0:对象 名:"name1"1:对象 名:"name2"2:对象 名:"name3"3:对象 名:"name4"长度:4
(linkto:jsfiddle)
我知道这里有很多类似的问题,我想我已经把它们都读了.我的问题是我试图遍历一个数组列表并从每个数组中获取一个值.阵列已由第三方设置,我无权配置我接收它们的方式.这是我到目前为止所拥有的:
for ($i = 0; $i < $length; $i++) {
// Both of these work and return the value I need
echo $post->related_credits_0_related_show[0];
echo "{$post->related_credits_0_related_show[0]}"
// But none of these do, and I need to loop through a handful of arrays
echo "{$post->related_credits_{$i}_related_show[0]}";
echo "{$post->related_credits_${i}_related_show[0]}";
echo "{$post->related_credits_{${i}}_related_show[0]}";
echo "{$post->related_credits_".$i."_related_show[0]}";
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了很多(很多!)更多我不会包含的组合.我也尝试将$ i转换为字符串.我一直在反对这个问题.
提前感谢您的帮助.
现在使用新的PHP 7.0.0,我有点担心所谓的"变量变量"的评估顺序的变化.
在此页面的 "对变量处理的更改"下,将显示一个表,其中包含表达式示例及其处理顺序,在PHP 5和PHP 7中.列出的四个表达式为:
$$foo['bar']['baz']
$foo->$bar['baz']
$foo->$bar['baz']()
Foo::$bar['baz']()
Run Code Online (Sandbox Code Playgroud)
给定以下字符串和数组:
$qux = 'quux';
$foo = array('bar' => array('baz' => 'qux'));
Run Code Online (Sandbox Code Playgroud)
表中的第一个表达式在$$foo['bar']['baz']PHP 5 中被解释为一个名为value in的变量的值$foo['bar']['baz'],因此值为$qux,即 'quux'.
但是,在PHP 7中,正如我所理解的那样,同一个表达式将被解释为一个名为value in的变量$foo,因此我希望PHP注意'数组到字符串转换',因为它$foo是一个数组.
表中的其他示例似乎是同一主题的变体.
当然,我很好奇为什么在PHP 7中改变了这一点(具体来说,为什么这种改变比向后兼容更重要),然而,这对SO来说不是一个合适的问题.我的问题更实用:
应对这种不兼容性的推荐方法是什么?
当然,加入大括号违规表达式将有助于(${$foo['bar']['baz']},$foo->{$bar['baz']},$foo->{$bar['baz']}()和Foo::{$bar['baz']}()),但是这是非常麻烦的,经历吨的旧代码,寻找相对较少occurances ...
否则,这四个示例是唯一可能的语法变体吗?也就是说,我可以创建一个RegExp和grep所有违规代码吗?可能存在哪些其他变化?
这是我想要做的:
<?php
$my_str = "My String";
$str = "%my_str";
$str = str_replace("%", "$", $str);
echo $str;
?>
Run Code Online (Sandbox Code Playgroud)
上面的代码将'$ my_str'打印到屏幕上.但我希望它打印'My String',就像变量$ my_str的实际值一样
有人知道怎么做吗?
我想要这个的原因是因为我正在编写自己的,非常基本的解析语言,所以在我继续之前我需要这个功能.
我试图在一个单独的函数中引用一个已定义的常量.我得到的错误是指未定义的变量,以及为每个FOO和BAR定义为常量的变量.
class Boo {
public function runScare() {
$this->nowScaring('FOO');
$this->nowScaring('BAR');
}
private function nowScaring($personRequest) {
define ('FOO', "test foo");
define ('BAR', "test bar");
$person = ${$personRequest};
echo "<br/>Query selected is: " . $person . "<br/>";
}
}
$scare = new Boo;
$scare->runScare();
Run Code Online (Sandbox Code Playgroud)