__call() 是 PHP 的一种魔术方法(magic method),用于在对象中捕获未定义的方法调用。当尝试调用一个不存在的方法时,PHP 解释器会自动调用对象的 __call() 方法,将原本要调用的方法名和参数列表作为参数传递给该方法。这样可以在运行时动态处理方法调用,从而实现更灵活的对象行为。
__call() 方法需要定义在一个类中,它接受两个参数:方法名和参数列表。方法名参数是一个字符串,表示要调用的方法名,而参数列表则是一个数组,包含了要传递给该方法的参数。在 __call() 方法中,开发者可以根据方法名和参数列表来实现任意的处理逻辑,例如动态调用其他方法、返回一个固定的值或抛出一个异常等。
底层原理是 PHP 解释器在解析方法调用时,会首先检查该方法是否已在类中明确定义。如果找到了定义,则直接调用该方法;否则,解释器将自动调用 __call() 方法,并将原本要调用的方法名和参数列表作为参数传递给该方法。这样,开发者就可以在 __call() 方法中动态处理未定义的方法调用,并返回一个适当的结果。
需要注意的是,__call() 方法只会在尝试调用未定义的方法时才会被调用,已定义的方法不会被拦截。此外,如果对象没有定义 __call() 方法,PHP 解释器将会抛出一个 BadMethodCallException 异常,表示方法调用失败。因此,如果需要实现动态方法调用,开发者应该在对象中定义 __call() 方法,并在其中处理未定义的方法调用。