【问题标题】:Where is the implementation of all the methods (roundCentury, addDay, addDays...) in nesbot/carbon library in Laravel?Laravel 的 nesbot/carbon 库中所有方法(roundCentury、addDay、addDays...)的实现在哪里?
【发布时间】:2022-01-19 11:16:54
【问题描述】:

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

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

提前致谢

【问题讨论】:

  • 你试过他们的 GitHub 吗?
  • 您是否在代码中搜索过roundCentury
  • @brombeer 问题说是的,他们有。如果你这样做了,你会发现它们是对的:这些方法是使用某种“宏”系统实现的,而不是对象本身。
  • @LajosArpad 不是他们的代码,是第三方库;问题已经表明他们已经看过了。
  • @IMSoP 我知道这一点。但它可能在供应商文件夹中。我总是会开始在本地搜索它,因为如果我找到正在运行的确切代码,那么我会排除版本差异造成的误解。如果没有找到,那我就上网找找。

标签: php laravel-8 php-carbon


【解决方案1】:

Carbon的代码结构相当复杂,包括大量使用PHP traitsa custom "macro" system,但最终我找到了Carbon\Traits\Date的定义,它包含在Carbon\Carbon等主要类中。

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

对于舍入,调用roundMethod,它在another 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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2019-11-30
        • 1970-01-01
        • 2013-11-22
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多