Rumah > rangka kerja php > Laravel > teks badan

Ringkaskan sintaks PHP yang biasa digunakan dalam Laravel

藏色散人
Lepaskan: 2021-09-13 14:16:13
ke hadapan
2156 orang telah melayarinya

Kata Pengantar

Rangka kerja Laravelkerana reka bentuk komponennya dan penggunaan reka bentuk yang betul Corak menjadikan rangka kerja itu sendiri ringkas dan mudah dipanjangkan. Berbeza daripada rangka kerja fungsi bersepadu ThinkPHP (sama ada semua fungsi digunakan atau tiada), Laravel menggunakan alat komposer untuk menguruskan pakej Jika anda ingin menambah fungsi, anda boleh menambah komponen secara langsung. Contohnya, jika anda menulis perangkak dan menggunakan komponen koleksi halaman: composer require jaeger/querylist

Artikel ini memperkenalkan secara ringkas ciri PHP dan sintaks baharu yang kerap digunakan dalam Laravel. Sila rujuk padanya untuk mendapatkan butiran.

Pembangunan berasaskan komponen

Laravel melaksanakan pembangunan berasaskan komponen terima kasih kepada alat komposer yang mengikut spesifikasi PSR-4, yang menggunakan ruang nama dan pemuatan automatik untuk menyusun fail projek. Lebih banyak rujukan: mekanisme pemuatan automatik komposer

Ruang nama

Konflik nama

Apabila bekerjasama dalam pasukan dan memperkenalkan kod bergantung pihak ketiga, kelas, fungsi dan antara muka mungkin sering muncul Duplikat nama. Contohnya:

<?php     
# google.php
class User 
{
    private $name;
}
Salin selepas log masuk
<?php     
# mine.php
// 引入第三方依赖
include &#39;google.php&#39;;

class User
{
    private $name;
}

$user = new User();    // 命名冲突
Salin selepas log masuk

Konflik penamaan berlaku kerana kelas User ditakrifkan pada masa yang sama:

Ringkaskan sintaks PHP yang biasa digunakan dalam Laravel

Penyelesaian

Dari PHP 5.3 telah diperkenalkan Rujuk manual PHP untuk mengetahui bahawa ruang nama mempunyai dua fungsi: mengelakkan konflik penamaan dan mengekalkan nama pendek . Contohnya, selepas menggunakan ruang nama:

<?php # google.php
namespace Google;

// 模拟第三方依赖
class User {
    private $name = &#39;google&#39;;

    public function getName() {
        echo $this->name . PHP_EOL;
    }
}
Salin selepas log masuk
<?php # mine.php
namespace Mine;

// 导入并命名别名
use Google as G;

// 导入文件使得 google.php 命名空间变为 mine.php 的子命名空间
include &#39;google.php&#39;;

/* 避免了命名冲突 */
class User
{
    private $name = &#39;mine&#39;;

    public function getName() {
        echo $this->name . PHP_EOL;
    }
}

/* 保持了命名简短 */
// 如果没有命名空间,为了类名也不冲突,可能会出现这种函数名
// $user = new Google_User();
// Zend 风格并不提倡
$user = new G\User();

// 为了函数名也不冲突,可能会出现这种函数名
// $user->google_get_name()
$user->getName();

$user = new User();
$user->getName();
Salin selepas log masuk

Jalankan:

$ php demo.php
google
mine
Salin selepas log masuk

Spesifikasi PSR

Malah, ruang nama tidak ada kaitan dengan fail nama, tetapi mengikut keperluan standard PSR: Ruang nama konsisten dengan laluan fail & nama fail konsisten dengan nama kelas. Contohnya, laravel-demo/app/Http/Controllers/Auth/LoginController.php yang dijana oleh Laravel secara lalai mempunyai ruang nama AppHttpControllersAuth & nama kelas LoginController

yang mengikut spesifikasi mine.php dan google.php di atas sepatutnya dipanggil User.php

pengendali ruang nama dan __NAMESPACE__ pemalar ajaib

...
// $user = new User();
$user = new namespace\User();    // 值为当前命名空间
$user->getName();

echo __NAMESPACE__ . PHP_EOL;    // 直接获取当前命名空间字符串    // 输出 Mine
Salin selepas log masuk

Import tiga ruang nama

<?php namespace CurrentNameSpace;

// 不包含前缀
$user = new User();        # CurrentNameSpace\User();

// 指定前缀
$user = new Google\User();    # CurrentNameSpace\Google\User();

// 根前缀
$user = new \Google\User();    # \Google\User();
Salin selepas log masuk

Ruang nama global

Jika kelas yang dirujuk, Jika fungsi tidak menentukan ruang nama, ia akan dicari di bawah __NAMESPACE__ secara lalai. Untuk merujuk kelas global:

<?php namespace Demo;

// 均不会被使用到
function strlen() {}
const INI_ALL = 3;
class Exception {}

$a = \strlen(&#39;hi&#39;);         // 调用全局函数 strlen
$b = \CREDITS_GROUP;          // 访问全局常量 CREDITS_GROUP
$c = new \Exception(&#39;error&#39;);   // 实例化全局类 Exception
Salin selepas log masuk

Berbilang import dan berbilang ruang nama

// use 可一次导入多个命名空间
use Google,
    Microsoft;

// 良好实践:每行一个 use
use Google;
use Microsoft;
Salin selepas log masuk
<?php // 一个文件可定义多个命名空间
namespace Google {
    class User {}
}    
    
namespace Microsoft {
    class User {}
}   

// 良好实践:“一个文件一个类”
Salin selepas log masuk

Import pemalar, fungsi

Bermula dari PHP 5.6, anda boleh Gunakan use function dan use const untuk mengimport fungsi dan pemalar masing-masing Gunakan:

# google.php
const CEO = 'Sundar Pichai';
function getMarketValue() {
    echo '770 billion dollars' . PHP_EOL;
}
Salin selepas log masuk
# mine.php
use function Google\getMarketValue as thirdMarketValue;
use const Google\CEO as third_CEO;

thirdMarketValue();
echo third_CEO;
Salin selepas log masuk

Jalankan:

$ php mine.php
google
770 billion dollars
Sundar Pichaimine
Mine
Salin selepas log masuk

Fail mengandungi

Pemuatan manual

Gunakan

atau include untuk memperkenalkan fail yang ditentukan (Tafsiran literal) Sila ambil perhatian bahawa jika ralat memerlukan berlaku, ralat kompilasi akan dilaporkan dan skrip akan terganggu, manakala ralat sertakan hanya akan. laporkan amaran dan skrip akan terus berjalan. require

serta fail, ia akan pergi ke direktori yang ditentukan oleh item konfigurasi

terlebih dahulu dalam php.ini untuk mencari Jika ia tidak menemuinya, ia akan mencari dalam direktori semasa: include_path

Ringkaskan sintaks PHP yang biasa digunakan dalam Laravel

<?php     
// 引入的是 /usr/share/php/System.php
include &#39;System.php&#39;;
Salin selepas log masuk
Automuat

Kelas boleh dimuatkan secara automatik, tetapi spl_autoload_register biasanya digunakan untuk mendaftar secara manual: void __autoload(string $class )

<?php // 自动加载子目录 classes 下 *.class.php 的类定义
function __autoload($class) {
    include &#39;classes/&#39; . $class . &#39;.class.php&#39;;
}

// PHP 5.3 后直接使用匿名函数注册
$throw = true;        // 注册出错时是否抛出异常
$prepend = false;    // 是否将当前注册函数添加到队列头

spl_autoload_register(function ($class) {
    include &#39;classes/&#39; . $class . &#39;.class.php&#39;;
}, $throw, $prepend);
Salin selepas log masuk
Auto -memuatkan fail yang dijana oleh komposer

boleh dilihat dalam: laravel-demo/vendor/composer/autoload_real.php

class ComposerAutoloaderInit8b41a
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            // 加载当前目录下文件
            require __DIR__ . '/ClassLoader.php';
        }
    }
    
     public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }
    
        // 注册自己的加载器
        spl_autoload_register(array('ComposerAutoloaderInit8b41a6', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        spl_autoload_unregister(array('ComposerAutoloaderInit8b41a6a', 'loadClassLoader'));

        ...
     }
 
    ...
}
Salin selepas log masuk
Saya hanya akan menyebut di sini bagaimana Laravel melakukan pemuatan automatik secara keseluruhan, yang akan diterangkan secara terperinci dalam artikel berikut.

Refleksi

Rujuk manual PHP, yang boleh difahami secara ringkas sebagai mendapatkan maklumat lengkap objek pada masa jalan. Terdapat 5 kelas refleksi:

ReflectionClass     // 解析类名
ReflectionProperty     // 获取和设置类属性的信息(属性名和值、注释、访问权限)
ReflectionMethod     // 获取和设置类函数的信息(函数名、注释、访问权限)、执行函数等
ReflectionParameter    // 获取函数的参数信息
ReflectionFunction    // 获取函数信息
Salin selepas log masuk
Sebagai contoh, penggunaan

: ReflectionClass

<?php class User
{
    public $name;
    public $age;

    public function __construct($name = &#39;Laruence&#39;, $age = 35) {
        $this->name = $name;
        $this->age  = $age;
    }

    public function intro() {
        echo '[name]: ' . $this->name . PHP_EOL;
        echo '[age]: '  . $this->age  . PHP_EOL;
    }
}

reflect('User');

// ReflectionClass 反射类使用示例
function reflect($class) {
    try {
        $ref = new ReflectionClass($class);
        // 检查是否可实例化
        // interface、abstract class、 __construct() 为 private 的类均不可实例化
        if (!$ref->isInstantiable()) {
            echo "[can't instantiable]: ${class}\n";
        }

        // 输出属性列表
        // 还能获取方法列表、静态常量等信息,具体参考手册
        foreach ($ref->getProperties() as $attr) {
            echo $attr->getName() . PHP_EOL;
        }

        // 直接调用类中的方法,个人认为这是反射最好用的地方
        $obj = $ref->newInstanceArgs();
        $obj->intro();
    } catch (ReflectionException $e) {
            // try catch 机制真的不优雅
            // 相比之下 Golang 的错误处理虽然繁琐,但很简洁
        echo '[reflection exception: ]' . $e->getMessage();
    }
}
Salin selepas log masuk
Larian:

$ php reflect.php
name
age
[name]: Laruence
[age]: 35
Salin selepas log masuk
Baki 4 refleksi kelas merujuk kepada demo manual Itu sahaja.

Ikatan statik lewat

Rujuk manual PHP dan lihat contoh dahulu:

<?php class Base
{
        // 后期绑定不局限于 static 方法
    public static function call() {
        echo &#39;[called]: &#39; . __CLASS__ . PHP_EOL;
    }

    public static function test() {
        self::call();        // self   取值为 Base  直接调用本类中的函数
        static::call();        // static 取值为 Child 调用者
    }
}

class Child extends Base
{
    public static function call() {
        echo &#39;[called]: &#39; . __CLASS__ . PHP_EOL;
    }
}


Child::test();
Salin selepas log masuk
Output:

$ php late_static_bind.php
[called]: Base
[called]: Child
Salin selepas log masuk
Apabila objek adalah instantiated ,

akan membuat instantiate kelas yang ditakrifkan dan self:: akan instantiate kelas yang memanggilnya. static::

ciri

Penggunaan asas

Rujuk manual PHP Walaupun PHP adalah warisan tunggal, dari 5.4 dan seterusnya, "kelas" boleh dilaksanakan dengan menggabungkan "kelas" secara mendatar. Ciri-ciri. Pewarisan berbilang sebenarnya adalah untuk membahagikan fungsi berulang kepada triat dan meletakkannya dalam fail yang berbeza, dan memperkenalkan dan menggabungkannya mengikut keperluan melalui kata kunci penggunaan. Warisan boleh dilaksanakan dengan analogi dengan gabungan struct cramming Golang. Contohnya:

<?php class DemoLogger
{
    public function log($message, $level) {
        echo "[message]: $message", PHP_EOL;
        echo "[level]: $level", PHP_EOL;
    }
}

trait Loggable
{
    protected $logger;

    public function setLogger($logger) {
        $this->logger = $logger;
    }

    public function log($message, $level) {
        $this->logger->log($message, $level);
    }
}

class Foo
{
        // 直接引入 Loggable 的代码片段
    use Loggable;
}

$foo = new Foo;
$foo->setLogger(new DemoLogger);
$foo->log('trait works', 1);
Salin selepas log masuk
Jalankan:

$ php trait.php
[message]: trait works
[level]: 1
Salin selepas log masuk
Lagi rujukan: Apa yang saya faham tentang PHP Trait

Sifat penting

Keutamaan

Fungsi kelas semasa akan menimpa fungsi nama yang sama bagi sifat, dan sifat akan menimpa fungsi nama yang sama kelas induk (

Ia bersamaan dengan kelas semasa yang menimpa terus fungsi nama yang sama bagi kelas induk)use trait

Konflik fungsi trait

Pengenalan berbilang sifat pada masa yang sama boleh dipisahkan dengan

, iaitu, pewarisan berbilang. ,

多个 trait 有同名函数时,引入将发生命名冲突,使用 insteadof 来指明使用哪个 trait 的函数。

重命名与访问控制

使用 as 关键字可以重命名的 trait 中引入的函数,还可以修改其访问权限。

其他

trait 类似于类,可以定义属性、方法、抽象方法、静态方法和静态属性。

下边的苹果、微软和 Linux 的小栗子来说明:

<?php trait Apple
{
    public function getCEO() {
        echo &#39;[Apple CEO]: Tim Cook&#39;, PHP_EOL;
    }

    public function getMarketValue() {
        echo &#39;[Apple Market Value]: 953 billion&#39;, PHP_EOL;
    }
}


trait MicroSoft
{
    public function getCEO() {
        echo &#39;[MicroSoft CEO]: Satya Nadella&#39;, PHP_EOL;
    }

    public function getMarketValue() {
        echo &#39;[MicroSoft Market Value]: 780 billion&#39;, PHP_EOL;
    }

    abstract public function MadeGreatOS();

    static public function staticFunc() {
        echo &#39;[MicroSoft Static Function]&#39;, PHP_EOL;
    }

    public function staticValue() {
        static $v;
        $v++;
        echo &#39;[MicroSoft Static Value]: &#39; . $v, PHP_EOL;
    }
}


// Apple 最终登顶,成为第一家市值超万亿美元的企业
trait Top
{
    // 处理引入的 trait 之间的冲突
    use Apple, MicroSoft {
        Apple::getCEO insteadof MicroSoft;
        Apple::getMarketValue insteadof MicroSoft;
    }
}


class Linux
{
    use Top {
            // as 关键字可以重命名函数、修改权限控制
        getCEO as private noCEO;
    }

    // 引入后必须实现抽象方法
    public function MadeGreatOS() {
        echo &#39;[Linux Already Made]&#39;, PHP_EOL;
    }

    public function getMarketValue() {
        echo &#39;[Linux Market Value]: Infinity&#39;, PHP_EOL;
    }
}

$linux = new Linux();
// 和 extends 继承一样
// 当前类中的同名函数也会覆盖 trait 中的函数
$linux->getMarketValue();

// trait 中可以定义静态方法
$linux::staticFunc();

// 在 trait Top 中已解决过冲突,输出库克
$linux->getCEO();
// $linux->noCEO();        // Uncaught Error: Call to private method Linux::noCEO() 

// trait 中可以定义静态变量
$linux->staticValue();
$linux->staticValue();
Salin selepas log masuk

运行:

$ php trait.php
[Linux Market Value]: Infinity
[MicroSoft Static Function]
[Apple CEO]: Tim Cook
[MicroSoft Static Value]: 1
[MicroSoft Static Value]: 2
Salin selepas log masuk

总结

本节简要提及了命名空间、文件自动加载、反射机制与 trait 等,Laravel 正是恰如其分的利用了这些新特性,才实现了组件化开发、服务加载等优雅的特性。

Atas ialah kandungan terperinci Ringkaskan sintaks PHP yang biasa digunakan dalam Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:wuYin/blog
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan