【问题标题】:Passing object element to class not as a string (like constant) in php?将对象元素传递给类而不是php中的字符串(如常量)?
【发布时间】:2010-06-04 00:58:32
【问题描述】:

如何将“项目”动态传递给类函数?

例如,这里是某个类的一部分及其函数,我将对象(项目)的元素声明为 $b:

//..........
     public function __add2SomeObj($b) {    

        $namespc = $this -> __someObj();  // __someObj() returns object
        $namespc -> cats = $b;

            }
//...................

我可以动态传递任何其他名称而不是cats,这样它就不会被声明为字符串吗? 即类似:

    //..........
         public function __add2SomeObj($a,$b) { 

            $namespc = $this -> __someObj();  // __someObj() returns object
            $namespc -> $a = $b;

                }
    //...................
} //end of class started above

$t=new aboveClass()
$t->__add2SomeObj("cats", array(1=>"PussyCat",2=>"Scratchy"));
$t->__add2SomeObj("dogs", array(1=>"Waffy",2=>"Sharik")); // once again but dogs...

我应该定义一个常量或做什么,还是应该将这个受保护的变量声明为像(object) $vaaar 这样的对象? 对不起,我对 PHP OOP 有点不熟悉...

【问题讨论】:

    标签: php oop class object


    【解决方案1】:

    是的,您可以这样做。阅读variable variables

    类属性也可以使用变量属性名来访问。变量属性名称将在进行调用的范围内解析。例如,如果您有 $foo->$bar 之类的表达式,则将检查本地范围的 $bar,并将其值用作 $foo 的属性名称。如果$bar 是一个数组访问也是如此。


    但是在处理数组时你必须小心:

    $namespc->$a[0]
    

    将从$namespc->$a 返回的数组中获取第一个元素。

    $namespc->{$a[0]}
    

    将首先解析$a[0],即获取数组$a的第一个值,并将其用作属性名称。

    【讨论】:

    • 谢谢!这正是我所寻找的,它奏效了!啊,这就是为什么在一些 SQL 语句中我遇到这些刻花括号的原因!
    • @moogeek:是的,它被称为复杂语法,如果字符串中有变量,则主要使用它。你可以在这里阅读:php.net/manual/de/…
    【解决方案2】:

    您要问的是您是否可以在运行时决定在__add2SomeObj 中更改哪个属性,就像您在第二个清单中一样。你可以,而且你做的是正确的。

    但是,属性必须是字符串__add2SomeObj,所以你应该确保$a参数是一个字符串(它会自动转换成字符串,但是如果$a是一个对象或一个数组)。

    其次,您还允许调用者更改任意属性。这可能会也可能不会违反类的封装,具体取决于类__someObj 返回和__add2SomeObj 类。它还将在对象$namespce(即,该类的所有对象中不存在的)上创建一个动态属性,您可能不希望这样做。

    最后,由于前面的观点,__add2SomeObj 可能会产生致命错误。所以我想说你最好根据一组允许的属性名称来验证 $a 参数。

    【讨论】:

    • 感谢有用的批评!当然,我会在生产中考虑这些东西,但上面的示例只是将响应者指向问题情节的草稿!
    【解决方案3】:

    你的语法是正确的:

    $obj->cats = $b;
    

    $a = 'cats';
    $obj->$a = $b;
    

    会做同样的事情。

    至于是否将"cats" 设为常量,由您决定。我建议把错误报告放上去:

    error_reporting(E_ALL | E_STRICT);
    

    这样,如果您不小心输入了"cast",而这不是一个有效的成员,您将收到一个错误。

    最后,PHP 是一种动态语言。我感觉你的背景可能是更多的静态语言。这只是你需要适应的东西,你需要在可读性和冗长之间找到平衡。但无论您做什么,都不要尝试在 PHP 中重新创建非 PHP 习语,这对于从一种语言转向另一种语言的人来说是一个常见的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多