使用count计数可数对象

时间:2016-06-13 14:16:45

标签: php

列出PHP文档Countable::count中的链接,第一个示例如何工作?

<?php
class myCounter implements Countable {
    private $count = 0;
    public function count() {
        return ++$this->count;
    }
}

$counter = new myCounter;

for($i=0; $i<10; ++$i) {
    echo "I have been count()ed " . count($counter) . " times\n";
}

函数count是否有可能访问班级private中的$count字段myCounter,以及如何?

4 个答案:

答案 0 :(得分:5)

PHP count函数未访问私有$count。实际发生的是:

    使用参数count 调用
  1. $counter(PHP函数)
  2. 该函数测试$counter是否为数组,而不是。它会检查$counter是否实现了接口Countable
  3. 因为$counter确实实现了接口Countable,所以它有一个公共方法count(与PHP函数分开)。
  4. PHP调用$counter->count(),然后返回其结果。
  5. 如您所见,没有提及私人$count。 public count方法可以执行常规类方法所能做的任何事情 - 包括访问实例的私有变量。考虑一下:

    class myCounter implements Countable {
        public function count(){
            return 42;
        }
    }
    
    $counter = new myCounter;
    echo "I have " . count($counter) . " items.";
    

    哪会导致:

    I have 42 items.
    

答案 1 :(得分:2)

php函数count(arg)接受数组或Countable对象作为参数。 Countable是实现Countable接口的Class的实例:它意味着它必须具有返回整数的count方法。你是如何实现它的,它取决于你。您可以使用示例中的变量来保持计数,或者您可以返回随机数或任何您想要的数字。所以为了回答你的问题,没有count()函数不访问私有字段$ count,但是它调用了类实现的count方法。

答案 2 :(得分:1)

这只是一个基本的例子,它只是在每次运行计数时递增一个变量。您可以轻松地将其与以下内容进行交换:

class Repository implements Countable {
    private $data = [];
    public function count() {
        return count($this->data);
    }
}

这是包含$data属性中记录的存储库的另一个示例。使用count($instanceOfRepository)将返回$data的计数。

答案 3 :(得分:1)

count功能无法访问您班级中的private字段$count。它会调用public界面中描述的count方法Countable

这个特殊的例子有点奇怪,因为它实际上计算了调用count函数的次数,它可能会使读者感到困惑。