如果您的困惑更多地是关于代码如何工作而不是它的作用,那实际上是一个非常复杂的主题。首先,这不是一个真正的静态方法。
Laravel使用一些叫做Facades的东西,它允许你“静态地”调用方法,这可能会让新来的人感到困惑。简而言之,外墙是非常方便的,因为当您使用Laravel的外观调用方法时,它为您“遮罩”大量实例对象,然后调用该方法。
在这个例子中我们以Schema
为例。这个Schema
班在哪里?如果你看看你的config/app.php
文件中,你会看到这行代码下别名:因此
'Schema' => Illuminate\Support\Facades\Schema::class,
Schema
为Illuminate\Support\Facades\Schema
的别名。
所以,如果你看看Illuminate\Support\Facades\Schema
,你会发现它extends Facade
。这是Laravel的门面之一。这个目录有很多Laravel的外墙。无论如何,在这个类的顶部,你还会看到一个小便利的评论,说:
@see \Illuminate\Database\Schema\Builder
打开该文件,这是你的Schema
类。在幕后,Laravel为你实例化这个对象。为什么这么重要?看看构造函数。这个班的其中一个依赖是Illuminate\Database\Connection
。打开这个类,它有更多的依赖关系。门面不是一直手动实例化所有这些类,而是为你做这项工作。因此,当您执行Schema::create(...
时,Laravel正在实例化所有这些依赖关系,并调用Illuminate\Database\Schema\Builder
类中的create
方法。很棒,对吗?如果您在该文件看,你会看到方法:
/**
* Create a new table on the schema.
*
* @param string $table
* @param \Closure $callback
* @return \Illuminate\Database\Schema\Blueprint
*/
public function create($table, Closure $callback)
{
$blueprint = $this->createBlueprint($table);
$blueprint->create();
$callback($blueprint);
$this->build($blueprint);
}
你可以看到它的不是静态方法。 Laravel正在幕后创建一个新实例,然后调用该方法。
第一个参数接受一个字符串,它将是您正在创建的表的名称。然后它接受封闭。在这种情况下,正如@ Kostas Mitsarakis所说,您正在创建一个名为tasks
的表格。该表具有一个名为id
等的自动递增列。
'up()'触发一个“新的模式” - 我认为模式是Laraval中的组件或模型(从未使用过)。该调用中的函数是[回调函数](http://php.net/manual/en/language.types.callable.php) - 用于告诉'Schema :: create'它应该如何处理其处理。 –
另请注意,'create'是'Schema'类的[静态方法](http://php.net/manual/en/language.oop5.static.php)。 –