无法理解 PHP 代码示例怎么办?
创始人
2024-05-29 14:49:14
0

PHP的代码示例也有很多种情况,最简单的是某个依赖库中文档的示例,难一点的是某个业务实现的代码,再难一点的是设计模式中的一些例子。第一种情况下,不应该出现无法理解的情况,因为这类代码基本都是最简单最易读的写法了。

最简单的代码示例

以阿里云的OSS上传为例,一般来讲阿里云的文档还是很舒服的:

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";
// 由本地文件路径加文件名包括后缀组成,例如/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武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

相关内容

热门资讯

安卓7.0系统速度咋样,速度与... 你有没有发现,自从手机更新到安卓7.0系统后,感觉整个手机都焕然一新了呢?今天,就让我来给你详细聊聊...
安卓文件系统隔离,Androi... 你知道吗?在安卓的世界里,有一个神奇的小秘密,那就是安卓文件系统隔离。听起来是不是有点高大上?别急,...
电脑板安卓系统下载,轻松实现多... 你有没有想过,你的电脑板突然间变得如此强大,竟然能运行安卓系统?没错,这就是科技的魅力!今天,就让我...
安卓系统双开app排行,热门双... 安卓系统双开App排行大揭秘在数字化时代,手机已经成为我们生活中不可或缺的一部分。而安卓系统,作为全...
安卓原生系统谁在开发,谷歌主导... 你有没有想过,那个陪伴你每天刷抖音、玩游戏、办公的安卓系统,究竟是谁在背后默默开发呢?今天,就让我带...
vive属于安卓系统吗,揭秘V... 你有没有想过,那个让人眼前一亮的VR设备Vive,它到底是不是安卓系统的呢?这个问题,估计不少对VR...
ios系统和安卓系统传递文件,... 你有没有想过,当你把一张照片或者一个文件从你的手机传给朋友时,背后其实是一个复杂的系统在默默工作呢?...
安卓刷鸿蒙系统工具,一招解锁全... 你有没有想过,让你的安卓手机也来一场华丽的变身?没错,就是那种从安卓系统切换到鸿蒙系统的神奇之旅。今...
安卓系统看不到系统文件,为何无... 你是不是也遇到了这样的烦恼?手机里明明有好多文件,可就是找不到它们的小身影,安卓系统竟然看不到系统文...
安卓系统升级模式,迭代创新与用... 你知道吗?安卓系统升级模式,这可是个让人又爱又恨的话题。每次手机收到升级通知,心里既期待又紧张,就像...
安装安卓虚拟系统教程,安卓虚拟... 你有没有想过在电脑上也能体验安卓系统的乐趣呢?没错,就是那种随时随地都能玩手机游戏、刷抖音的感觉,现...
叶茂然安卓系统下载,畅享智能生... 你有没有听说最近叶茂然安卓系统下载成了热门话题?没错,就是那个叶茂然安卓系统!今天,我就要带你全方位...
安卓子系统下载地址,深度解析下... 你有没有想过,你的安卓手机里那些神秘的子系统其实也可以下载下来,自己动手安装呢?没错,今天就要来给你...
安卓手机系统铃声替换,唤醒你的... 你有没有发现,每次手机响个不停,是不是总想给它换个铃声,让它听起来更个性、更有范儿?没错,安卓手机系...
登陆系统和安卓系统区别,差异解... 你有没有想过,为什么你的手机里装了那么多应用,却还是觉得登陆系统有点儿麻烦呢?今天,就让我带你一起探...
安卓系统手表壁纸华为,科技美学... 你有没有发现,最近安卓系统手表的江湖风头正劲呢?尤其是华为家的那些宝贝,简直让人爱不释手。今天,就让...
安卓系统闹钟组件设置,轻松打造... 你有没有发现,每天早上闹钟响起的时候,是不是总感觉时间过得飞快,一转眼又是一个新的一天呢?今天,就让...
安卓系统的几大组件,组件架构与... 你有没有发现,你的安卓手机里藏着许多神奇的“小精灵”呢?它们默默无闻地工作,让你的手机变得如此强大和...
安卓系统关闭app流量,轻松关... 手机里的APP们是不是有时候让你觉得流量消耗得有点儿太快了呢?别急,今天就来教你几招,让你的安卓手机...
安卓系统无尽之海,安卓系统中的... 安卓系统,无尽之海中的航行者想象你正站在一望无际的海洋边,海风轻拂,波光粼粼。这片海洋,深邃而神秘,...