gpt4 book ai didi

php - PHP 可以剖析自己的语法吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:57:15 24 4
gpt4 key购买 nike

PHP 可以剖析自己的语法吗?例如,我想编写一个函数来接收像 $object->attribute 这样的输入。并对自己说:

OK, he's giving me $foo->bar, which means he must think that $foo is an object that has a property called bar. Before I try accessing bar and potentially get a 'Trying to get property of non-object' error, let me check whether $foo is even an object.

最终目标是如果设置了值就回显,如果没有则静默失败

我想避免这样的重复:

<input value="<? if(is_object($foo) && is_set($foo->bar)){ echo $foo->bar; }?> "/>

...并避免编写执行上述操作的函数,但必须分别传入对象和属性,如下所示:

<input value="<? echoAttribute($foo,'bar') ?>" />

...但是要代替写一些东西:

  • 保留对象->属性语法
  • 灵活:也可以处理数组键或常规变量

像这样:

<input value="<? echoIfSet($foo->bar); ?> />
<input value="<? echoIfSet($baz['buzz']); ?> />
<input value="<? echoIfSet($moo); ?> />

但这一切都取决于 PHP 能够告诉我“当我说 $object->attribute$array[$key] 时,我在请求什么样的东西”,这样我的函数就可以根据它们自己的类型来处理它们。

这可能吗?

更新

我在这里得到了一些很好的答案并做了一些实验。想总结一下。

  • 我最初问题的答案似乎是“否”,但我们确实找到了一种方法来完成我正在尝试做的事情。 Techpriester 指出我可以将字符串 '$foo->bar' 传递给函数并让它解析它和 eval()它。不是我想采用的方法,但值得一提。
  • Peter Bailey 指出类似 $foo->bar 的东西在传递给函数之前得到评估。我应该想到这一点,但出于某种原因没有。谢谢,彼得!
  • Will Vousden 表明传递 $foo->$bar通过引用允许函数对其求值,而不是事先求值。他的功能表明isset($foo->bar)如果 $foo 不会提示不是我不知道的对象。

更有趣的是,他的示例似乎暗示 PHP 会等到绝对必要时才对变量求值。

如果您要按值 传递某些内容,那么 PHP 当然必须立即确定。像这样:

$foo->bar = 'hi';
somefunction($foo->bar); // same as somefunction('hi');

但如果您通过引用传递,它可以等待实际需要时确定值。

像这样(按照事情发生的顺序):

echo ifSet($foo->bar); // PHP has not yet evaluated $foo->bar...
function ifSet(&$somevar){ // ...because we're passing by reference (&$somevar)
// Now we're inside the function, but it still hasn't evaluated $foo->bar; it
// just made its local variable, $somevar, point to the same thing as $foo->bar
if(isset($somevar)){ // Right HERE is where it's evaluated - when we need it
return $bar;
}
}

感谢所有回复的人!如果我说错了什么,请告诉我。

最佳答案

您可以通过引用传递它:

<?php

function foo(&$bar)
{
if (isset($bar))
{
echo "$bar\r\n";
}
else
{
echo "It's not set!\r\n";
}
}

$baz = new stdClass;
$baz->test = 'test';
foo($baz->test);
foo($baz->test2);

$baz = array();
foo($baz['test3']);

?>

请注意,如果您尝试将对象作为数组访问,这将不起作用,反之亦然。

不过,您不应该过分依赖这样的东西。

关于php - PHP 可以剖析自己的语法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2758812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com