Laravel nesbot/carbon 库中所有方法(roundCentury、addDay、addDays...)的实现在哪里?

Where is the implementation of all the methods (roundCentury, addDay, addDays...) in nesbot/carbon library in Laravel?

我尝试查看 nesbot/carbon 供应商源代码中的所有文件,但仍然找不到一些方法的实现,例如 roundCentury、addDay、addDays... 除了 php 文档块.

因为我想知道这些方法是如何工作的。 我想知道这些方法的实现在哪里?

提前致谢

round*** 动态支持任何单元,因此每个单元都没有硬编码方法,只有一个方法,__call() 负责解析方法名称,select合适的单位: https://github.com/briannesbitt/Carbon/blob/b017c794d31626a324c8216ff222fb895306c911/src/Carbon/Traits/Rounding.php#L40

Carbon 的代码结构相当复杂,包括大量使用 PHP traits and a custom "macro" system,但最终我追踪到 Carbon\Traits\Date 的定义,它包含在主要的 类 中,例如 Carbon\Carbon.

这并没有直接定义方法,而是实现method overloading via __call,其中方法名称作为字符串传入。 Carbon 代码实际上 解析方法名称 来决定它应该做什么。

取整,就是调用roundMethod,定义在另一个trait,叫做Carbon\Traits\IntervalRounding,主线是这样的:

return $this->{$action.'Unit'}(substr($method, \strlen($action)), ...$parameters);

对于roundCentury$action是“圆”,substr部分取名字的其余部分,所以得到:

return $this->roundUnit('Century', ...$parameters);

roundUnit 的定义在 另一个 特征中,Carbon\Traits\Rounding.

“添加...”方法的工作原理可能类似。

名称为 addDay 的函数未在 Carbon 的来源中列出。因此很难找到实际动作发生的地方。当调用 addDay 时,Traits/Date.php 中的魔法函数 __call() 被激活。它被分成一个“添加”操作和一个“日”单元,并分支到 addUnit() 方法。在那里我们会找到实际操作:

$date = $date->modify("$value $unit");