Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时使用PHP stdClass_Php_Oop - Fatal编程技术网

何时使用PHP stdClass

何时使用PHP stdClass,php,oop,Php,Oop,以下代码来自Google的recaptcha库。他们没有使用stdClass,而是使用了一个单独的类。我理解,如果他们将属性预先设置为给定值甚至NULL,那么这将很有帮助,但我不明白在这种情况下为什么会这样做。像他们那样做有什么价值吗,或者stdClass更合适吗 class ReCaptchaResponse { var $is_valid; var $error; } $recaptcha_response = new ReCaptchaResponse();

以下代码来自Google的recaptcha库。他们没有使用stdClass,而是使用了一个单独的类。我理解,如果他们将属性预先设置为给定值甚至NULL,那么这将很有帮助,但我不明白在这种情况下为什么会这样做。像他们那样做有什么价值吗,或者stdClass更合适吗

class ReCaptchaResponse {
        var $is_valid;
        var $error;
}
$recaptcha_response = new ReCaptchaResponse();
$recaptcha_response->is_valid = false;
$recaptcha_response->error = 'incorrect-captcha-sol';

例如,将该类视为未来的接口和可扩展性。RecaptCharResponse也是stdClass


您应该向作者询问他的想法。

例如,将该类视为未来的接口和可扩展性。RecaptCharResponse也是stdClass

你应该向作者询问他的想法。

重述共享响应比stdClass更易于阅读和理解

但从编程角度看,这是一样的。

RecaptCharResponse比stdClass更易于阅读和理解

但在编程上是一样的

像他们那样做有什么价值吗,或者stdClass更合适吗

RecapCharResponse比stdClass更为用户友好 增加了将来在不修改其他部分的情况下扩展类的可能性。 为什么要使用stdClass呢?我们不能在所有相同的情况下使用数组吗

如果希望将数据从一个函数传递到另一个函数,并修改数据,则可以使用stdClass。您可以对关联数组执行相同的操作,但如果错过引用调用,则可能会出错

$a = array();
function test1(&$a) {
    $a['key'] = 1234;
}
test($a);

function test2($a) { // possible error
    $a['key'] = 1234;
}
test2($a);

$a = new stdClass();
function test3($a) {
    $a->key = 1234;
}
test3($a);
但这种类型的结构在实际场景中极不可能出现

像他们那样做有什么价值吗,或者stdClass更合适吗

RecapCharResponse比stdClass更为用户友好 增加了将来在不修改其他部分的情况下扩展类的可能性。 为什么要使用stdClass呢?我们不能在所有相同的情况下使用数组吗

如果希望将数据从一个函数传递到另一个函数,并修改数据,则可以使用stdClass。您可以对关联数组执行相同的操作,但如果错过引用调用,则可能会出错

$a = array();
function test1(&$a) {
    $a['key'] = 1234;
}
test($a);

function test2($a) { // possible error
    $a['key'] = 1234;
}
test2($a);

$a = new stdClass();
function test3($a) {
    $a->key = 1234;
}
test3($a);

但这种类型的结构在实际场景中是不太可能的。

这在一定程度上是一个观点问题,但就我个人而言,我从未使用过stdClass,也从未理解这样做的意义

对象的目的是封装数据和行为,无论是通过向对象添加公共和私有方法,使用继承和多态性来构造项目,还是通过定义良好的命名类型

在某些语言中,例如JavaScript,对象作为通用键值存储非常有用,即使属性完全是临时添加的;在PHP中,这个角色可以简单有效地由关联数组填充

有些人会使用stdClass对象作为键值存储,但这样做会失去对数组周围所有函数的使用。对象将作为一种指针进行传递/分配,这与通过引用传递变量不同,而不是根据需要进行复制,因此行为会有所不同,但如果您没有有意使用OOP的封装特性,那么您可能会创建一个类,很难说这是一件好事还是一个引起混乱的机会

在其他语言(如C)中,可以使用预定义的命名成员定义自定义结构类型。PHP没有这样的类型,但是像您展示的那个简单的无方法类非常接近

其他语言中不适用于PHP的另一个优势是,对象的基类可以具有一些功能,甚至可以像JavaScript或Ruby那样允许您添加一些功能。在PHP中,stdClass是完全惰性的,不能编辑,事实上并没有用作其他对象的基类;它唯一的魔法能力是当某些东西被施放时成为目标类,或者成为object类型

使用命名类的直接好处包括:

PHP引擎以及IDE和代码嗅探器等工具知道应该存在哪些属性,并且可以在设置无效属性(例如拼写错误)时发出警告 您可以使用instanceOf而不是instanceOf检查传递的特定值是否是正确的对象类型 您可以在以后轻松地扩展对象以获得额外的功能,或者使其成为继承层次结构的一部分,等等
这在一定程度上是一个观点问题,但就我个人而言,我从未使用过stdClass,我也从未理解这样做的意义

对象的目的是封装数据和行为,无论是通过向对象添加公共和私有方法,使用继承和多态性来构造项目,还是通过定义良好的命名类型

在某些语言中,例如JavaScript,对象作为通用键值存储非常有用,即使属性完全是临时添加的;在PHP中,这个角色可以简单有效地由关联数组填充

有些人会使用stdClass对象作为键值存储,但这样做会失去对数组周围所有函数的使用。对象将作为一种指针进行传递/分配,这与通过引用传递变量不同,而不是根据需要进行复制,因此行为会有所不同,但如果您没有有意使用OOP的封装特性,那么您可能会创建一个类,很难说这是一件好事还是一个引起混乱的机会

在其他语言(如C)中,可以使用预定义的命名成员定义自定义结构类型。PHP没有这样的类型,但是像您展示的那个简单的无方法类非常接近

其他语言中不适用于PHP的另一个优势是,对象的基类可以具有一些功能,甚至可以像JavaScript或Ruby那样允许您添加一些功能。在PHP中,stdClass是完全惰性的,不能编辑,事实上并没有用作其他对象的基类;它唯一的魔法能力是当某些东西被施放时成为目标类,或者成为object类型

使用命名类的直接好处包括:

PHP引擎以及IDE和代码嗅探器等工具知道应该存在哪些属性,并且可以在设置无效属性(例如拼写错误)时发出警告 您可以使用instanceOf而不是instanceOf检查传递的特定值是否是正确的对象类型 您可以在以后轻松地扩展对象以获得额外的功能,或者使其成为继承层次结构的一部分,等等
我个人永远不会写任何新的代码来实例化stdClass的实例

通过创建自己的类,即使您根本不添加任何功能,您也能够显式地说出该对象表示的内容,例如API客户端返回的结果,而使用该API的人可以键入该类以确保该类型的对象被传递


此外,如果您将对象用作数据的简单容器,那么实现ArrayAccess、Countable和Iterator或IteratorAggregate通常是有意义的—这样您可以像数组一样循环访问它或访问它,这非常有用。

我个人永远不会,是否编写过任何新代码来实例化stdClass的实例

通过创建自己的类,即使您根本不添加任何功能,您也能够显式地说出该对象表示的内容,例如API客户端返回的结果,而使用该API的人可以键入该类以确保该类型的对象被传递


此外,如果您将对象用作数据的简单容器,那么实现ArrayAccess、Countable和Iterator或IteratorAggregate通常是有意义的—这样您就可以像数组一样对其进行循环或访问,这是非常有用的。

那么您是否提倡从不使用stdClass?在某些情况下,使用stdClass更方便。例如,当在对象中包装一些变量以便对其进行json_编码时。但是全面的OOP结构应该有“有意义的”类名。@Rotherford将它们包装在关联数组中不会有同样的效果,而且声明起来更简单?基本上没有区别@罗瑟福,看起来像是这个问题的近似复制品。但我的意思是初始化一个数组,比如$x=['foo'=>$foo,'bar'=>$bar],比初始化一个对象,比如$x=new stdClass简单得多$x->foo=$foo$x->bar=$bar;-将object['foo'=>$foo,'bar'=>$bar]传递给json_encode将是完全没有意义的。那么您是否提倡从不使用stdClass?在某些情况下,使用stdClass更方便。例如,当在对象中包装一些变量以便对其进行json_编码时。但是全面的OOP结构应该有“有意义的”类名。@Rotherford将它们包装在关联数组中不会有同样的效果,而且声明起来更简单?基本上没有区别@罗瑟福,看起来像是这个问题的近似复制品。但我的意思是初始化一个数组,比如$x=['foo'=>$foo,'bar'=>$bar],比初始化一个对象,比如$x=new stdClass简单得多$x->foo=$foo$x->bar=$bar;-将object['foo'=>$foo,'bar'=>$bar]传递给json_encode将完全没有意义。另一个相关问题可能重复,更多地处理实际命名的类,但在答案中有一些关于stdClass的注释:@IMSoP。我认为它不是复制品。我在发布我的问题之前读过这个问题,它质疑是否应该使用对象或数组。我在问是否应该使用预定义的stdClass;我认为这三个问题都涉及到一些相同的问题,但实际上并不相同。也是相关的,但信息量不大。可能重复另一个相关问题,更多地处理实际命名的类,但使用一些命令
答案中有关于stdClass的提示:@IMSoP。我认为它不是复制品。我在发布我的问题之前读过这个问题,它质疑是否应该使用对象或数组。我在问是否应该使用预定义的stdClass;我认为这三个问题都涉及到一些相同的问题,但实际上并不相同。也是相关的,但信息不是很丰富。+1用于提及编辑就地方面,我没有想到这一点。虽然可以说,如果您像结构一样使用stdClass,那么这种行为实际上就不那么直观了,当您使用具有副作用的对象方法时,这种行为就更有意义了。很难对php中stdClass的可用性进行争论,因为我们也可以用其他方式来做事情。我个人认为如果stdClass不够直观,那么就使用它:Pwhy函数test2$a{//可能的错误$a['key']=1234;}+1会出现错误,因为它提到了我没有想到的编辑就地方面。虽然可以说,如果您像结构一样使用stdClass,那么这种行为实际上就不那么直观了,当您使用具有副作用的对象方法时,这种行为就更有意义了。很难对php中stdClass的可用性进行争论,因为我们也可以用其他方式来做事情。就个人而言,我认为如果stdClass不够直观,那么就使用它:Pwhy函数test2$a{//可能的错误$a['key']=1234;}