这个代码是什么意思...?
What is this code meaning...?
我想为我提出这个问题。为了更好地理解 PHP 和 Laravel.
public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
}
这实际上是一个方法,里面有一个静态函数吗?在这个静态函数内部还有另一个......?我不得不说我是 Frameworks 的初学者。
这是我第一次玩。
它创建一个 table tasks
,id
作为 auto increment
列,name
作为 varchar
列,created_at
updated_at
作为 timestamp
列。
更多信息here。
如果您对代码的工作原理而不是代码的作用感到困惑,那么这实际上是一个相当复杂的主题。首先,它并不是真正的静态方法。
Laravel 使用调用 Facades 的东西,允许您调用方法 "statically",这可能会让刚接触该框架的人感到困惑。简而言之,外观非常方便,因为当您使用 Laravel 的外观调用方法时,它 "masks" 为您提供大量实例对象,然后调用该方法。
让我们以 Schema
为例。这个Schema
class在哪里?如果您查看 config/app.php
文件,您会在别名下看到这行代码:
'Schema' => Illuminate\Support\Facades\Schema::class,
Schema
因此是 Illuminate\Support\Facades\Schema
.
的别名
因此,如果您查看 Illuminate\Support\Facades\Schema
,您会发现它 extends Facade
。它是 Laravel 的门面之一。这个目录有大量 Laravel 的外观。无论如何,在这个 class 的顶部,您还会看到一个方便的注释,上面写着:
@see \Illuminate\Database\Schema\Builder
打开那个文件,这是你的 Schema
class。在幕后,Laravel 为您实例化此对象。为什么这是一件大事?看一下构造函数。 class 的依赖项之一是 Illuminate\Database\Connection
。打开 class,它有更多的依赖项。不必一直手动实例化所有这些 classes,facades 会为您完成这些工作。因此,当您执行 Schema::create(...
时,Laravel 正在实例化所有这些依赖项并调用 Illuminate\Database\Schema\Builder
class 中的 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 正在后台创建一个新实例,然后调用该方法。
第一个参数接受一个字符串,它是您正在创建的 table 的名称。然后它接受一个闭包。在这种情况下,正如@Kostas Mitsarakis 所说,您正在创建一个名为 tasks
的 table。此 table 有一个名为 id
的自动递增列,等等
我想为我提出这个问题。为了更好地理解 PHP 和 Laravel.
public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
}
这实际上是一个方法,里面有一个静态函数吗?在这个静态函数内部还有另一个......?我不得不说我是 Frameworks 的初学者。
这是我第一次玩。
它创建一个 table tasks
,id
作为 auto increment
列,name
作为 varchar
列,created_at
updated_at
作为 timestamp
列。
更多信息here。
如果您对代码的工作原理而不是代码的作用感到困惑,那么这实际上是一个相当复杂的主题。首先,它并不是真正的静态方法。
Laravel 使用调用 Facades 的东西,允许您调用方法 "statically",这可能会让刚接触该框架的人感到困惑。简而言之,外观非常方便,因为当您使用 Laravel 的外观调用方法时,它 "masks" 为您提供大量实例对象,然后调用该方法。
让我们以 Schema
为例。这个Schema
class在哪里?如果您查看 config/app.php
文件,您会在别名下看到这行代码:
'Schema' => Illuminate\Support\Facades\Schema::class,
Schema
因此是 Illuminate\Support\Facades\Schema
.
因此,如果您查看 Illuminate\Support\Facades\Schema
,您会发现它 extends Facade
。它是 Laravel 的门面之一。这个目录有大量 Laravel 的外观。无论如何,在这个 class 的顶部,您还会看到一个方便的注释,上面写着:
@see \Illuminate\Database\Schema\Builder
打开那个文件,这是你的 Schema
class。在幕后,Laravel 为您实例化此对象。为什么这是一件大事?看一下构造函数。 class 的依赖项之一是 Illuminate\Database\Connection
。打开 class,它有更多的依赖项。不必一直手动实例化所有这些 classes,facades 会为您完成这些工作。因此,当您执行 Schema::create(...
时,Laravel 正在实例化所有这些依赖项并调用 Illuminate\Database\Schema\Builder
class 中的 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 正在后台创建一个新实例,然后调用该方法。
第一个参数接受一个字符串,它是您正在创建的 table 的名称。然后它接受一个闭包。在这种情况下,正如@Kostas Mitsarakis 所说,您正在创建一个名为 tasks
的 table。此 table 有一个名为 id
的自动递增列,等等