PHP的代码示例也有很多种情形,最大略的是某个依赖库中文档的示例,难一点的是某个业务实现的代码,再难一点的是设计模式中的一些例子。第一种情形下,不应该涌现无法理解的情形,由于这类代码基本都是最大略最易读的写法了。
最大略的代码示例以阿里云的OSS上传为例,一样平常来讲阿里云的文档还是很舒畅的:
<?phpif (is_file(__DIR__ . '/../autoload.php')) { require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) { require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并利用RAM用户进行API访问或日常运维,请登录RAM掌握台创建RAM用户。$accessKeyId = "yourAccessKeyId";$accessKeySecret = "yourAccessKeySecret";// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。$endpoint = "yourEndpoint";// 填写Bucket名称,例如examplebucket。$bucket= "examplebucket";// 填写Object完全路径,例如exampledir/exampleobject.txt。Object完全路径中不能包含Bucket名称。$object = "exampledir/exampleobject.txt";// <yourLocalFile>由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt。// 填写本地文件的完全路径,例如D:\\localpath\\examplefile.txt。如果未指定本地路径,则默认从示例程序所属项目对该当地路径中上传文件。$filePath = "D:\\localpath\\examplefile.txt";try{ $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint); $ossClient->uploadFile($bucket, $object, $filePath);} catch(OssException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return;}print(__FUNCTION__ . "OK" . "\n");
以上是他的一个文档代码,它的文档还有更好的一点,便是险些每一行都有注释,但即便没有注释,当你面对这些代码的时候,你也该当“翻译”成下面的样子。

引入文件(require_once)通过命名空间引入类库代码(use xxx)设置一大堆的账号参数(声明各个变量)实例化客户端(new )通过客户端工具上传文件,传入指定参数(调用uploadFile方法)处理一些缺点(打印缺点信息)处理业务情形(输出OK)
如果这段代码你做不到这个水平,看不懂,那可以分成两个情形,
1:你是真的不懂,可能不适宜编程。
2:你被各种英文单词和符号迷惑了,这解释你的PHP根本很差劲,连语法都没适应,要连续学习基本的知识。
3:你没有一个明确的编程目的,没有理解到这段代码的“功能(需求)”。
上面的代码,如果你不清楚什么是require_once use $ ; ( ) new try 这些东西,你可以通过学习语法办理。其余你要有个观点,便是这段代码是干什么的,你要有一个大大的标题在这个代码的上方,比如“利用阿里的工具存储客户端上传文件”,这也很有助于理解代码。
难一点的业务代码这类代码你必须要知道编程的目的,必须知道他的功能是什么,紧张是办理什么问题,才能理解清楚。
比如下面这段代码:
Route::rule('resizer', function (Request $request) { $request_src = $request->pathinfo(); $m = $request->param('m', 1); $w = $request->param('w', null); $h = $request->param('h', null); $src = str_replace('resizer/', '', $request_src); $cache_key = "{$src}-{$m}-{$w}-{$h}"; $content_data = Cache::get($cache_key); if (is_null($content_data)) { $img_src = App::getRootPath() . 'public/' . $src; if (!file_exists($img_src)) { return json_message('图片不存在', 404)->code('404'); } $img = Image::make($img_src); if (!is_null($w) || !is_null($h)) { $img->resize($w, $h, function ($constraint) use ($m) { if ($m == 0) { } elseif ($m == 1) { $constraint->aspectRatio(); } elseif ($m == 2) { $constraint->aspectRatio(); $constraint->upsize(); } }); } $img_content = (string)$img->psrResponse()->getBody(); $img_content_type = $img->mime(); $content_data = [ 'content' => $img_content, 'content_type' => $img_content_type ]; Cache::set($cache_key, $content_data); } $file_name = basename($src); return download($content_data['content']) ->isContent(true) ->name($file_name) ->contentType($content_data['content_type']) ->mimeType($content_data['content_type']) ->expire(25920000) ->force(false);});
这段代码实在并不是很繁芜,通读下来,你基本可以得到下面的信息:
它吸收许多GET参数这些参数会做一个缓存在没有缓存的时候,通过这些参数做一些事彷佛是实现根据参数做图片的裁剪变形之类的操作终极以文件的办法相应结果
如果能理解以上的信息,解释你已经读懂了,但如果要修正他的功能,却要再做更多理解,比如:
图片文件的路径是什么?支持什么样的图片操作?第一个小问题实在很好理解,通过`request_src`变量就可以知道,真实的路径文件是将这个字符串去掉`resizer/`得来的,然后再拼接系统中的前缀,得到真实的路径。
至于这个变量是怎么样通过GET参数传过来的,如果用过ThinkPHP,那么就知道这是框架供应的一个方法,但即便不知道,也不用担心,这是其他的问题,目前我们已经知道真实的文件路径是怎么来的了。
同理,他拼接的前缀详细是多少,是怎么实现的,如果用过ThinkPHP,那么很清楚这是什么,但即便不知道,也不用担心,目前已经知道“要拼接一个路径前缀”,就够了。
如果想知道这些“参数是怎么传过来的?”,“拼接的前缀是什么?”,这些问题,实在最好的答案或许不是阅读源码,而是找找框架的文档,但如果不知道这是什么框架的话怎么办呢?可以定位到这些方法的源码,或许他是一个依赖库,这意味着他有composer.json,就意味着知道他的名字和文档地址了。
实在阅读源码是不得已末了的手段,也须要更高的编程履历和知识。
第二个小问题彷佛很繁芜,但他跟m、w、h这几个变量有关系,顺着这几个变量找找,能找到一个if语句判断,显然m决定了实行什么样的方法,或许意思是“模式”,而w和h该当是图片的新的宽度和高度,如果找到`$img->resize`的文档或者阅读源码,就能做实这一点。
设计模式的代码示例这个很难举例了,但是这些代码基本都能看到这个东西:
/ Plugins pass-through. @param string $method @param array $arguments @return mixed /public function __call($method, array $arguments){ array_unshift($arguments, $this->path); $callback = [$this->filesystem, $method]; try { return call_user_func_array($callback, $arguments); } catch (BadMethodCallException $e) { throw new BadMethodCallException( 'Call to undefined method ' . get_called_class() . '::' . $method ); }}
这是一个魔术方法,当调用一个“不可调用”的方法的时候,调用的方法名和参数就会进入这里。
这个东西是真好用,但是这真不好理解。这个代码还是很大略的,当调用这个类的方法不存在的时候,就试图去调用filesystem属性的方法,那么说,这个filesystem属性该当是一个工具。
这段代码实在便是league/flysystem的代码,大家可以去看看。
如果跟踪filesystem属性,就会创造,他不是一个详细的类,他声明的是一个抽象类,这意味着:有可能有多种类型的filesystem。
这就麻烦了,得找到详细是“哪行代码”实例化了工具并赋给这个属性。找到这行代码,估计还会创造,他是通过不同的配置参数来实例化不同的类,就彷佛“驱动”一样,不同的驱动是不同的代码,涌现的问题也不一样。如果是本地存储,那么缺点可能便是没有权限之类的,而如果是ftp,则网络涌现问题,他也会报错。
这实在是很大略的代码了,只是利用了抽象类而已。
总结本文希望能展示出开拓者是如何理解代码的。总的来说,必须要打好根本,否则代码看着不顺眼,很影响阅读代码。其次是多理解盛行的框架和库,不求能够一眼看出代码,但要一些非常热门的框架要用过,知道怎么着文档。其余,理解代码是一层一层递进的,而不是一眼试图把所有的参数方法搞清楚。
要先清楚功能是干什么的目的是什么办理什么问题想要什么结果比如:把表单提交存起来,并更新账号,再做个敏感日期要十分熟习代码看代码要像看书一样,不能费劲巴拉不能看到代码引起不适要搞清楚输入和输出是什么代码是怎么开始的代码结束的时候做了那些事可以试图搞清楚每个参数、每个方法、每行代码是什么了但实在大多数情形下,不须要每个参数和代码都要搞清楚,大体上知道某个位置在干什么就行原文标题:无法理解 PHP 代码示例怎么办?
原文地址:https://phpreturn.com/index/a64059d62aaf8f.html
原文平台:PHP武器库
版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站许可任何形式的转载/引用文章,但必须同时注明出处。