当前位置: 首页 > 后端技术 > PHP

Laravel框架中常用的PHP语法

时间:2023-03-30 01:39:14 PHP

原文:wuYin/blog,转载请注明出处。前言Laravel框架由于其组件化设计和适当使用设计模式而简单易扩展。不同于ThinkPHP的集成功能框架(功能要么用要么不用),Laravel使用composer工具进行包管理,如果要添加功能可以直接添加组件。比如你写一个爬虫,使用页面采集组件:composerrequirejaeger/querylist这篇文章简单介绍了Laravel中常用的PHP特性和新语法。详情请参阅。基于组件的开发Laravel的基于组件的开发得益于遵循PSR-4规范的composer工具,它使用命名空间和自动加载来组织项目文件。更多参考:ComposerautoloadingmechanismNamespacenamingconflict团队协作和第三方依赖代码引入时,类、函数、接口可能经常重名。例如:name.PHP_EOL;}}name.PHP_EOL;}}/*保持命名简短*///如果没有命名空间,也为类名不冲突,可能会出现这种函数名//$user=newGoogle_User();//Zend风格不提倡$user=newG\User();//为了函数名不冲突,可能会出现这种函数名//$user->google_get_name()$user->getName();$user=newUser();$user->getName();运行:$phpdemo.phpgoogleminePSR规范其实命名空间与文件名无关,但是根据PSR标准的要求:命名空间与文件路径一致&文件名与类名一致。例如,Laravel默认生成的laravel-demo/app/Http/Controllers/Auth/LoginController.php命名空间为App\Http\Controllers\Auth,类名LoginController遵循规范。上面的mine.php和google.php都是CallUser.phpnamespaceoperatorwith__NAMESPACE__magicconstant...//$user=newUser();$user=newnamespace\User();//值是当前命名空间$user->getName();回声__NAMESPACE__。PHP_EOL;//直接获取当前命名空间字符串//输出我的三个命名空间的导入name=$name;$this->age=$age;}publicfunctionintro(){echo'[name]:'.$这个->名字。PHP_EOL;回声'[年龄]:'。$这个->年龄。PHP_EOL;}}reflect('User');//使用ReflectionClass反射类函数的例子reflect($class){try{$ref=newReflectionClass($class);//检查是否可以被实例化//接口、抽象类、__construct()是私有类不能被实例化if(!$ref->isInstantiable()){echo"[can'tinstantiable]:${class}\n";}//输出属性列表//还可以获取方法列表、静态常量等信息,详见foreach的手册($ref->getProperties()as$att)r){echo$attr->getName().PHP_EOL;}//直接调用类中的方法,个人认为这是使用反射最好的地方$obj=$ref->newInstanceArgs();$obj->简介();}catch(ReflectionException$e){//trycatch机制确实不优雅//相比之下,Golang的错误处理很繁琐,但是很简洁echo'[reflectionexception:]'.$e->getMessage();}}运行:$phpreflect.phpnameage[name]:Laruence[age]:35剩下的4个反射参考手册demo可以静态绑定后面参考PHP手册,先看一个例子:logger=$logger;}publicfunctionlog($message,$level){$this->logger->log($message,$level);}}classFoo{//直接引入Loggable的代码片段使用Loggable;}$foo=newFoo;$foo->setLogger(newDemoLogger);$foo->log('traitworks',1);run:$phptrait.php[message]:traitworks[level]:1更多参考资料:了解PHPTraitPriority的重要属性当前类的函数会覆盖trait的同名函数,并且trait会覆盖父类的同名函数(使用trait相当于当前类直接覆盖父类的同名函数)trait函数冲突同时引入多个可用的trait,分开,即多重继承。当多个trait有同名函数时,import会导致命名冲突,使用insteadof表示使用哪个trait的函数。重命名和访问控制使用as关键字重命名traits中引入的函数并修改其访问权限。其他traits类似于类,可以定义属性、方法、抽象方法、静态方法和静态属性。下面用苹果、微软、Linux的小栗子来说明:}publicfunctiongetMarketValue(){echo'[AppleMarketValue]:9530亿',PHP_EOL;}}traitMicroSoft{publicfunctiongetCEO(){echo'[MicrosoftCEO]:SatyaNadella',PHP_EOL;}publicfunctiongetMarketValue(){echo'[MicrosoftMarketValue]:7800billion',PHP_EOL;}抽象公共函数MadeGreatOS();staticpublicfunctionstaticFunc(){echo'[MicrosoftStaticFunction]',PHP_EOL;}publicfunctionstaticValue(){static$v;$v++;echo'[Microsoft静态值]:'.$v,PHP_EOL;}}//苹果终于登顶,成为第一家市值超过万亿美元的企业Apple::getMarketValue而不是MicroSoft;}}classLinux{useTop{//as关键字可以重命名函数和修改权限控制getCEO为私人noCEO;}//抽象方法必须在引入后实现publicfunctionMadeGreatOS(){echo'[LinuxAlreadyMade]',PHP_EOL;}publicfunctiongetMarketValue(){echo'[LinuxMarketValue]:Infinity',PHP_EOL;}}$linux=newLinux();//同extends继承//当前类中的同名函数也会覆盖trait中的函数$linux->getMarketValue();//静态方法$linux可以在trait中定义::staticFunc();//冲突已经在trait中解决Top,输出Cook$linux->getCEO();//$linux->noCEO();//未捕获的错误:调用私有方法Linux::noCEO()//可以在特征中定义静态变量$linux->staticValue();$linux->staticValue();run:$phptrait.php[LinuxMarketValue]:Infinity[MicrosoftStaticFunction][AppleCEO]:TimCook[MicrosoftStaticValue]:1[MicrosoftStaticValue]:2Summary本节简单提到命名空间,自动文件加载,反射机制和traits等,Laravel正是利用这些新特性实现了组件开发、服务加载等Elegant特性