资讯专栏INFORMATION COLUMN

学习 PHP 程序新东西的另一种方法

henry14 / 1736人阅读

昨天在学习 SplDoublyLinkedList 的时候发现一个有趣的现象,比如

php$obj = new SplDoublyLinkedList();
$obj->push("string");

这时候想判断 $obj 里面到底有没有值,或是不是一个,并且里面的值为 "string",我们通常会:

phpprint_r($obj);

然后通过肉眼去看打印出来的,确实与我们想的一致,那么我们就会认为是成功的。如果不一致就会认为是失败的。

仔细想想,这种与我们要做的测试程序不是一模一样嘛,只不过测试程序是用来检测我们的代码有没有问题,但现在由于代码是 PHP 官网这种权威组织写的,我们可以认为都是对的,现在要是写测试程序的话,就是另一层函义了,不是测试他们的代码是否有问题,而是代表我们对这个功能的认识。

经常我们会用 print_r 来打印,有时候自己会主观的认为是这样是那样,然后看的也不一定很仔细,然后就认为是对的,最后实际使用时发现不是的想的那样(我有亲身经历),写测试就是让程序来判断,我们的想法是不是有问题,哪里出错了,最主要它还可以把当时的思路保持下来,以后再继续回顾。

以下是我在学习 SplDoublyLinkedList 时写的一些测试,以后看到这个测试类,就知道了 SplDoublyLinkedList 该怎么用了。

phppush(0);
        $obj->push(1);
        $obj->push(2);

        // Prepends value at the beginning of the doubly linked list.
        $obj->unshift(10);
        $obj->unshift(11);

        /*
         * 因为指针还未初始化
         * 所以
         * 1. 当前指针是否有效为 FALSE
         * 2. 直接获取当前指针的值会是 NULL
         */
        $this->assertEquals(FALSE, $obj->valid());
        $this->assertEquals(NULL, $obj->current());

        $obj->rewind();
        // 将指针重置之后,第一个肯定是 11 ,因为它是在最后执行了一个
        // 将 11 插入到链表最前面的一个函数 unshift
        $this->assertEquals(11, $obj->current());

        $obj->next();
        // 11 下面应该是 10
        $this->assertEquals(10, $obj->current());

        // (下一个 下一个 上一个) === (下一个)
        $obj->next(); // 0
        $obj->next(); // 1
        $obj->prev(); // 0
        $this->assertEquals(0, $obj->current());

        $obj->next(); // 1
        $obj->next(); // 2
        $obj->next(); // 已经超过最大的了,使用 valid 判断应该是 false
        $this->assertEquals(false, $obj->valid());
    }

    public function testSplDoublyLinkedListPart2()
    {
        $obj = new SplDoublyLinkedList();
        // Pushes value at the end of the doubly linked list.
        $obj->push(0);
        $obj->push(1);
        $obj->push(2);

        // Prepends value at the beginning of the doubly linked list.
        $obj->unshift(10);
        $obj->unshift(11);

        //  Peeks at the node from the end of the doubly linked list
        //  Return: The value of the last node.
        //  获取最后一个节点的值
        $this->assertEquals(2, $obj->top());

        // Peeks at the node from the beginning of the doubly linked list
        // Return: The value of the first node.
        // 获取第一个节点的值
        $this->assertEquals(11, $obj->bottom());
    }

    public function testIsEmpty(){
        $obj = new SplDoublyLinkedList();

        $this->assertEquals(true, $obj->isEmpty());

        $obj->unshift("string");
        // 这里已经有值了就应该是 false
        $this->assertEquals(false, $obj->isEmpty());

        // 这时再使用 pop 弹出最后一个就应该是 "string"
        $this->assertEquals("string", $obj->pop());

    }

    /**
     * 如果是空的时候试图 pop 弹出最后一个节点的值则会 抛出一个 RuntimeException
     *
     * @expectedException RuntimeException
     */
    public function testRuntimeException(){
        $obj = new SplDoublyLinkedList();
        $obj->pop();
    }

    public function testOffset(){
        $obj = new SplDoublyLinkedList();
        $obj->push("one");
        $obj->push("two");
        $obj->unshift("three");

        // 下标是从0 开始的 所以现在3 应该是不存在的
        $this->assertEquals(false, $obj->offsetExists(3));

        // 下标为2 的应该是存在的
        $this->assertEquals(true, $obj->offsetExists(2));

        $this->assertEquals("two", $obj->offsetGet(2));

        // 删除下标为0 的值
        $obj->offsetUnset(0);
        // 删除为 0 的值之后,后面的都会向前移一位
        // 所以现在的顺序为: one two
        $obj->rewind();
        $this->assertEquals("one", $obj->current());
        $this->assertEquals(0, $obj->key());

        $obj->next();
        $this->assertEquals("two", $obj->current());
        $this->assertEquals(1, $obj->key());
        // 并且总个数为 2
        $this->assertEquals(2, $obj->count());
    }

    public function testAdd(){
        $obj = new SplDoublyLinkedList();
        $obj->push("one");
        $obj->push("two");
        $obj->push("three");
        $obj->unshift("four");
        $obj->add(1, "five");

        // 这时候的顺序应该是:
        // four five one two three

        $obj->rewind();
        $this->assertEquals("four", $obj->current());
        $obj->next();
        $this->assertEquals("five", $obj->current());
        $obj->next();
        $this->assertEquals("one", $obj->current());
        $obj->next();
        $this->assertEquals("two", $obj->current());
        $obj->next();
        $this->assertEquals("three", $obj->current());
    }
}

原文链接 学习 PHP 程序新东西的另一种方法

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20943.html

相关文章

  • 我应该先学习哪种编程语言?

    摘要:我应该先学习哪种编程语言这一切都取决于你想要完成的事情作为技术作家,我的任务是使复杂的主题易于理解,因此在本文中您将找不到太多技术术语。我应该先学习哪种编程语言这是我自出版之前收到的最常见的问题。是一种后端语言。我应该先学习哪种编程语言? 这一切都取决于你想要完成的事情 作为技术作家,我的任务是使复杂的主题易于理解,因此在本文中您将找不到太多技术术语。我可以对面向对象的编...

    huashiou 评论0 收藏0
  • 我应该先学习哪种编程语言?

    摘要:我应该先学习哪种编程语言这一切都取决于你想要完成的事情作为技术作家,我的任务是使复杂的主题易于理解,因此在本文中您将找不到太多技术术语。我应该先学习哪种编程语言这是我自出版之前收到的最常见的问题。是一种后端语言。我应该先学习哪种编程语言? 这一切都取决于你想要完成的事情 作为技术作家,我的任务是使复杂的主题易于理解,因此在本文中您将找不到太多技术术语。我可以对面向对象的编...

    selfimpr 评论0 收藏0
  • 谈谈机器学习与传统编程之间的区别

    摘要:机器学习也是这个大筐中的一个组成部分。我们目前的发展阶段是机器学习正处在第二级和第三级交界处。机器学习工程师的职位是怎样的机器学习工程师的位置更具有技术性。换句话说,机器学习工程师与传统的软件工程有着比数据科学更多的相同点。 翻译:疯狂的技术宅https://towardsdatascience.co... showImg(https://segmentfault.com/img/b...

    王岩威 评论0 收藏0

发表评论

0条评论

henry14

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<