Doctrine:带有Array水合作用的字符串键

时间:2011-01-17 03:49:03

标签: php doctrine

根据他们的documentation,你应该使用Array水合而不是在为只读目的检索数据时记录水合作用。

但是,这意味着我必须使用数组和字符串键访问检索到的对象的属性:

$user['Phonenumbers'][0]['number']

而不是OO风格:

$user->PhoneNumbers[0]->number

现在我对PHP有点新意,但在其他语言中我使用第二种表示法会更好,因为拼写错误会在编译时捕获,而字符串文字中的拼写错误在运行时才会被注意到。这适用于PHP / Doctrine吗?

1 个答案:

答案 0 :(得分:0)

两种符号中的拼写错误都会在编译时被 NOT 捕获。两种符号中的拼写错误只会生成PHP_NOTICE,并且应用程序将继续运行,除非您尝试执行某些非法操作(例如,调用未定义的方法)。

考虑将'Phonenumbers'误称为'Phonenombers':

$number = $user['Phonenombers'][0]['number'];  // Notice: Undefined index
$number = $user->PhoneNombers[0]->number;      // Notice: Undefined property

或者在'用户'错误输入'userr'的情况下:

$number = $userr->PhoneNombers[0]->number; 
  // Notice: Undefined variable
  // Notice: Trying to get property of non-object

在上述所有情况下,变量$number都将设置为NULL

另一方面,下面的代码将导致PHP_ERROR,脚本将停止执行

$userr->free(); //Fatal error: Call to undefined method

上述所有示例仅在脚本运行时执行时才会分别生成PHP_NOTICEPHP_ERROR。例如,以下 NOT 生成任何PHP_NOTICEPHP_ERROR

if(false) {
   $userr->free();
}

所以,最后,答案是否定的,这不适用于PHP / Doctrine。如果你不需要Doctrine_Collection对象的任何方法,你应该使用数组水合作用,因为它更快并且使用更少的内存。