繁体   English   中英

在Laravel中使用范围解析运算符

[英]Using the Scope Resolution Operator in Laravel

我对OOP / Laravel的一个方面感到困惑。

我正在关注一个OOP教程(与Laravel无关),该教程指出,仅当您调用的方法为static时,才可以使用“范围解析运算符”。

因此,我创建了一个快速脚本;

class Student { 
  function welcome_students($var="Hello") {
    echo "{$var} students.";
  }  
}
echo Student::welcome_students("Greetings") ."<br />";

我得到了错误;

Strict Standards: Non-static method Student::welcome_students() should
not be called statically in /static_modifier.php on line 11 Greetings students.

但是在Laravel 5中,我注意到我一直在使用类似

`ClassName::whereIn($var = `

在我的许多控制器中。 我已经检查了存储whereIn方法的包,它不是static 这只是一个public function

那么Laravel 5如何让我摆脱它呢? 我处于开发模式,所以我不知道为什么我没有看到相同的消息。

为了完全掌握这种情况的发生,这里需要理解一些相当高级的概念。

首先,这仅适用于Laravel中的外墙。 这些可以在别名数组的app.php配置文件中找到。 这些立面中的每一个都可以被视为Laravel核心中其真实类的入口点。 因此,即使语法告诉您正在调用静态方法,但实际上发生的是Laravel将底层类解析为这些代理类,并在这些类上非静态地调用方法。

如果您去那些外观类中的一些,您会看到更好的效果,在这些类中您将看到正在调用的方法实际上不在这些类中。

要真正了解这是如何发生的,请阅读Laravel的控制容器反转(IoC),Facades的使用以及php magic方法__callStatic和php方法class_alias ,这是Laravel用于设置别名的方法。

同样,这些概念非常复杂,因此,如果它们看起来令人困惑或目的使您望而却步,请不要气disc。

基本上,工作流程如下所示:

  1. 您调用Config :: get()
  2. Laravel查找Config的别名,它是一个外观。
  3. 使用__callStatic魔术方法,Facade会找出要实例化的基础类,并以非静态方式对该实例进行调用。

http://laravel.com/docs/5.0/facades#explanation

http://laravel.com/docs/4.2/ioc#introduction

http://php.net/manual/en/language.oop5.overloading.php#object.callstatic

首先,您的函数不是静态的,如果要像Student::welcome_students()那样调用它,则需要对其进行更改

public static function welcome_students($var="Hello") {
    echo "{$var} students.";
  }  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM