Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/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 方法同时返回和重置属性?_Php - Fatal编程技术网

Php 方法同时返回和重置属性?

Php 方法同时返回和重置属性?,php,Php,让我们从这个示例类开始: class Widget { private static $items = []; public static function resetitems() { self::$items = []; } public static function getitems() { return self::$items; } public static function doobie() { // does somethin

让我们从这个示例类开始:

class Widget {
    private static $items = [];
    public static function resetitems() { self::$items = []; }
    public static function getitems()   { return self::$items; }
    public static function doobie() {
        // does something and adds a ton of junk to self::$items
    }
}
现在,可以通过以下方式获取和重置属性:

    Widget::doobie();
    $items = Widget::getitems();
    Widget::resetitems();
但是,我不必总是在
getitems
之后调用
resetitems
(当目的总是获取并重置时),而是尝试找到一种更优雅的方法,让
getitems
在返回期间自动执行此操作

我可以这样做:

    public static function getitems() {
        $wasteofspace = self::$items;
        self::resetitems();
        return $wasteofspace;
    }
但是,难道不应该有一种方法来返回direct属性本身并同时调用reset吗?像这样的东西(但这显然不起作用哈哈):

您可以使用:


一个非常巧妙的想法。一开始我很怀疑,但这确实有效。运行了一些测试,但似乎没有任何东西填充整个过程。请注意:这只适用于
数组的属性。不适用于其他类型的属性。然而,对于我的需要,这是我需要的。谢谢。@难以置信你说得对,它只对数组有效。就我个人而言,我只想使用你的第一次尝试:即使它更详细,它也更清晰(在我看来),并且像你刚才写的那样提供了更多的灵活性。是的。。。在视觉上(稍后阅读),我肯定我会问“这到底是在做什么?”:-)或者如果有人继承了代码,他们会困惑我的想法。在对Q中使用
array\u splice
与我的
getitems
方法进行了一些基准测试之后。。。
array\u-splice
返回速度慢了500%,并且在实际发生后会留下额外的内存(比如循环10k次后,仍然分配了比不使用array\u-splice时更多的ram)。我重新摆弄了一下长凳,摆弄了一下,结果还是一样的。因此,尽管这个答案非常巧妙,我还是要回到我在Q中使用的多行
getitems
方法。
    public static function getitems() {
        return self::$items & self::resetitems();
    }
    public static function get_and_reset_items() {
        return array_splice(self::$items, 0);
    }