faker $ generator属性如何允许我们调用其他提供者的格式化程序

时间:2016-10-20 06:20:11

标签: php faker

我是faker的新手,也是PHP的新手。我的问题是关于PHP如何工作。对于我的问题,我以Faker(一个生成伪数据的PHP库)为例。作为参考,网址是:

https://github.com/fzaninotto/Faker#faker-internals-understanding-providers

我正在阅读faker内部文档,并看到了这段代码:

 <?php

namespace Faker\Provider;

class Book extends \Faker\Provider\Base
{
  public function title($nbWords = 5)
  {
    $sentence = $this->generator->sentence($nbWords);
    return substr($sentence, 0, strlen($sentence) - 1);
  }

  public function ISBN()
  {
    return $this->generator->ean13();
  }
}

我很好奇的是ISBN方法。它基本上使用其生成的基类的$ protected属性来调用名为ean13()的方法。但箭头符号通常用于调用方法或获取对象内的变量。我知道$ generator是类Generator的一个对象,因为它在构造函数中定义如下:

    class Base
{
    /**
     * @var \Faker\Generator
     */
    protected $generator;

    /**
     * @var \Faker\UniqueGenerator
     */
    protected $unique;

    /**
     * @param \Faker\Generator $generator
     */
    public function __construct(Generator $generator)
    {
        $this->generator = $generator;
    }

但是我不知道程序在哪里找到方法ean13()。我打开了Generator类,找不到该名称的方法。我希望有经验的PHP开发人员能够解释它对我的实际效果。感谢

1 个答案:

答案 0 :(得分:0)

你偶然发现了PHP调用“方法重载”的用法。 (注意,“方法重载”在其他语言中具有不同的含义)。 PHP Doc for method overloading

如果您检查Generator类的源代码,您会在其中找到名为__call()的方法。 这样做是捕获对Generator类中不存在的方法的所有方法调用。 该方法依次调用format方法,该方法对ean13类中找到的可用格式化程序Barcode进行查找。

这是您编写和加载自己的格式化程序的方法,并执行

之类的操作

$faker->my_own_format()

无需触及Generator类本身。