关于PHP部分框架中 action 参数绑定的原理
例如THINKPHP
<code>class xxController { public function index($id,$age) { //这些参数是通过$_GET['id'],$_GET['age']来的 } } //按PHP的实现方法大致应该是以下 $ctr = new xxController(); return $ctr->index(); //他这里怎么有知道应该传哪些参数呢?! //本人愚钝,我想不是这样做的,那应该是怎么实现呢?!!请各位大神讲解一下其中的实现原理!</code>
回复内容:
例如THINKPHP
<code>class xxController { public function index($id,$age) { //这些参数是通过$_GET['id'],$_GET['age']来的 } } //按PHP的实现方法大致应该是以下 $ctr = new xxController(); return $ctr->index(); //他这里怎么有知道应该传哪些参数呢?! //本人愚钝,我想不是这样做的,那应该是怎么实现呢?!!请各位大神讲解一下其中的实现原理!</code>
反射,通过反射得的类的方法的参数列表。然后对应起来就可以。
<code><?php /** * 一个用于测试的类 * Class TestController */ class TestController { /** * 嗯,著名的hello world * @param $name */ public function helloWordAction($name) { echo "hello {$name}!".PHP_EOL; } } # 通过反射进行参数绑定调起类的方法 # @see http://php.net/manual/zh/book.reflection.php # 方法,从路由获取的,类也是由路由获取的,这里意思一下就好了 $action = 'helloWordAction'; # 传进来的参数,从路由获取的 $paramsInput['name'] = 'toozy'; # 获取类的反射 $controllerReflection = new ReflectionClass(TestController::class); # 不能实例化,就是不能new一个的话,这个游戏就玩不下去了啊 if (!$controllerReflection->isInstantiable()) { throw new RuntimeException("{$controllerReflection->getName()}不能被实例化"); } # 获取对应方法的反射 if (!$controllerReflection->hasMethod($action)) { throw new RuntimeException("{$controllerReflection->getName()}没有指定的方法:{$action}"); } $actionReflection = $controllerReflection->getMethod($action); # 获取方法的参数的反射列表(多个参数反射组成的数组) $paramReflectionList = $actionReflection->getParameters(); # 参数,用于action $params = []; # 循环参数反射 # 如果存在路由参数的名称和参数的名称一致,就压进params里面 # 如果存在默认值,就将默认值压进params里面 # 如果。。。没有如果了,异常 foreach ($paramReflectionList as $paramReflection) { # 是否存在同名字的路由参数 if (isset($paramsInput[$paramReflection->getName()])) { $params[] = $paramsInput[$paramReflection->getName()]; continue; } # 是否存在默认值 if ($paramReflection->isDefaultValueAvailable()) { $params[] = $paramReflection->getDefaultValue(); continue; } # 异常 throw new RuntimeException( "{$controllerReflection->getName()}::{$actionReflection->getName()}的参数{$paramReflection->getName()}必须传值" ); } # 调起 $actionReflection->invokeArgs($controllerReflection->newInstance(), $params);</code>
保存为:reflection.php
<code>root@work:/media/sf_project/php-hello-world# php refrection.php hello toozy!</code>
这种情况的框架都有一个“路由定义”,客户端只能匹配到定义好的路由,包含了路径、Method、以及请求参数。
拿 Laravel 举例:
<code>Route::get('api/article/{articleId}', 'ArticleController@articleDetail'); //... ArticleController extends Controller { public function articleDetail($articleId) { //... } }</code>
在匹配路由过程,因为定义的这个路由包含了{articleId}
这个约定好形式的占位符,路由模块会匹配包含 articleId 的 URL,并获取到参数值传给对应 Controller 的 action。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이번 장에서는 CakePHP의 환경 변수, 일반 구성, 데이터베이스 구성, 이메일 구성에 대해 알아봅니다.

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는
