目次
文件加载---理解一个project的第一步,---project
ホームページ php教程 php手册 文件加载---理解一个project的第一步,---project

文件加载---理解一个project的第一步,---project

Jun 13, 2016 am 09:15 AM
pro project 負荷 書類 理解する

文件加载---理解一个project的第一步,---project

  当我最开始写php的时候,总是担心这个问题:我在这儿new的一个class能加载到对应的类文件吗?毕竟一运行就报Fatal Error,什么**文件没找到,类无法实例化等等是一种很“低级”的错误,怕别人看了笑话。于是每接一个新任务,我总想把它的加载过程弄清楚(以前只知道几个html标签和样式,不知算不算web开发),有时头儿看了说还有闲心看这个,赶紧写逻辑,照这样做就行了......你妹你知道当然有把握了D:,后来发现原来流程都差不多。

  在一个IDE中开发时,如C++/Java,一般是新建一个工程,通过IDE新添加一个文件到指定目录下,然后#include/Import进来即可,php则使这一步骤更加过程化,文件的加载过程基本确定了这个project(框架或者自搭的项目)的目录结构和文件的分门别类。

   不管框架还是自搭的项目总得有个入口文件,这时要事先加载一些基本信息,如配置文件、通用方法等,使用的基本是手动直接加载单个文件形式,使用下面四个方法之一:

  include、require、include_once、require_once

    <span>include</span>('config.php'<span>);
    </span><span>require</span>('database.php');
ログイン後にコピー

  涉及到类文件的加载,少部分是直接加载,比如,通用方法作为静态方法写在一个类Utilities中,因为是后边很多要用到的方法(如错误输出、curl请求、随机字符串生成...),所以用类封装起来,一般也是在加载配置文件时连带加载进来

  include('Utilities.php');

  而更通用的情况是:类的动态加载。首先不谈的加载的方式,来看看大概什么时候会用到一个类和实例:

  1. 最明显的,$obj = new A; 它的变种$className = 'A'; $obj = $className; 都一样;

  2. 类的静态方法、静态变量和常量的调用,即Utilities::httpRequest()、Utilities::$instance、Utilities::HOST;

  3. 在php函数中,使用了回调函数的情况,最典型的call_user_func_array()(call_user_func),还有其他用到了callback的地方,如数组中的array_walk、array_map,它们需要一个回调函数作为参数。

  回调函数非常灵活,不止可以是简单函数,还可以是对象的方法,包括静态类方法。因为可以用对象方法或静态方法,所以这钟时候也要去加载对应的类文件。自php5.3起,回调函数还可以像js中,用匿名函数来实现。

     <span>class</span><span> A{
         </span><span>public</span> <span>static</span> <span>function</span> cube(<span>$var</span><span>){
             </span><span>return</span> <span>pow</span>(<span>$var</span>, 3<span>);
         }
         
         </span><span>public</span> <span>function</span> twice(<span>$var</span><span>){
             </span><span>return</span> 2*<span>$var</span><span>;
         }
     }
     </span><span>//</span><span> 使用类的静态方法</span>
     <span>$num</span> = <span>call_user_func</span>('A::cube', 5<span>);
     </span><span>//</span><span> 使用对象</span>
     <span>$obj</span> = <span>new</span><span> A;
     </span><span>$num</span> = <span>call_user_func_array</span>(<span>array</span>(<span>$obj</span>, 'twice'), <span>array</span>(7));
ログイン後にコピー

  严格来说上例中的call_user_func_array在之前已经实例化了对象,但是存在这么个用法,它完全也可以使用类静态方法。

  首先要明白的是,为什么需要动态加载。php是脚本语言,我们访问时,是以脚本为可用资源,比如现在根目录有个index.php文件,它没有include任何其他文件,当我们直接以localhost/index.php来访问时,可以访问到index.php中的全部资源,如果index.php中定义了一个普通类A,在该脚本中实例化一个A的对象时,程序会这样反应:哦,我已经看到了A的定义,可以直接实例化它(不需要加载其他文件)。如果还有类B、C、D等很多类,全部写在index.php中显然不行,那就写在其他文件中,再include进来(include已经在做加载的工作了),这样对程序来说,也是“可见”的了。

  但是随着系统功能的增多,类越来越多,各个类的功能也不同,有的直接定义数据库的操作,读取数据库的数据,有的是控制访问脚本时要运行的方法,有的则是将要展现出来的页面,有的是我们引用的第三方核心库,于是,当我们把所有的文件放在一个目录中时,虽然可以直接include加载,但这些文件摆放显得既杂乱无章又难找,维护成本还高。好呗,那就在根目录下再分别建几个目录,目录A专门存放与数据库打交道的脚本,目录B是系统的各种配置信息文件,目录C是控制我们进入程序时的入口控制方法的脚本,目录D是即将展示到浏览器的页面......

  于是MVC架构慢慢就演化出来了,我们不能再像以前那样直接include,脚本都放在特定的目录下,如Controller目录下存放的是各种控制器,加载控制器时,我们得这样include('root/Controller/indexController.php'),每次都在文件前面弄一大串的include不仅看着头疼,简直让人累觉不爱。既然有了获取当前文件路径和类名的现成方法,为何不将类名与文件名对应起来,而只要是控制器类的脚本就全放在根目录的Controller子目录下边,就可以写一个方法,只要是控制器类,在这个方法中运行include(ROOT.'Controller/'.$className.'.php');这一句,ROOT为根目录常量,$className为传入的类名,只要是模型类,就这样include(ROOT.'Model/'.$className.'.php');,全凭这个函数来动态控制到哪个目录里边去找,这个project可能就是这样的:

  无形中,就建立起了类名和文件名的对应规则,文件和所在的目录的对应规则,该project下有哪些这样的目录和文件呢?啊原来是放控制器的Controller、放配置信息的Config等等,再次于无形中得知了这个project的结构,而上面说的,利用函数根据一定条件(传入参数)可知自动到哪个目录下去加载该文件,而不是一个个写死的include,就是所谓的文件的动态加载了。

  因此,当你要新建一个**类文件时,也就知道,哦在这个project中,我应该放在这个目录下,文件的命名应该与类名相同,这样就一定能加载到了~~~接下来就是写业务逻辑的一个“愉快的过程”。

  知道什么时候会动态加载及为什么要动态加载后,接下来就是来实现了,也就是上面说到的利用函数来加载某个文件,就是要写好这个“函数”来实现这个过程。常用的有三种方式:

  1. __autoload

  我第一次学的时候就是用的就是这个,魔术函数,只要定义了php程序就会在要用到一个类时自动调用它进行文件动态加载,一样,既然它是个函数,就要让程序对__autoload的定义可见,不然从哪儿调用它呢?一般来说,作为后边程序大部分地方要用到的方法,我们都会放在一个单独的文件中,在程序的入口处加载进来,一个project总得有几个文件是手动include的,完全可以在开头单独include进来,或者放在配置信息中,加载配置信息时就加载进来了。它的原型:

  void __autoload ( string $class )

  参数当前加载的类名名称(注意如果有命名空间,则包含命名空间前缀),下面是一个针对上面的图片结构的简单示例:

    <span>//</span><span> file: autoload.php 
    // ROOT为已经定义的根目录常量</span>
    <span>function</span> __autoload(<span>$className</span><span>){
        </span><span>try</span><span>{
            </span><span>if</span>(<span>file_exists</span>(ROOT.'Controller/'.<span>$className</span>.'.php')){<span>//</span><span> 检查Controller</span>
                <span>include</span>(ROOT.'Controller/'.<span>$className</span>.'.php'<span>);
            }
            </span><span>else</span> <span>if</span>(<span>file_exists</span>(ROOT.'Model/'.<span>$className</span>.'.php')){<span>//</span><span> 检查Model</span>
                <span>include</span>(ROOT.'Model/'.<span>$className</span>.'.php'<span>);
            }
            </span><span>else</span> <span>if</span>(<span>file_exists</span>(ROOT.'Lib/'.<span>$className</span>.'.php')){<span>//</span><span> 检查Lib</span>
                <span>include</span>(ROOT.'Lib/'.<span>$className</span>.'.php'<span>);
            }
            </span><span>else</span>{                                               <span>//</span><span> 找不到该文件</span>
                <span>throw</span> <span>new</span> <span>Exception</span>("ERROR: can't find file {<span>$className</span>}.php"<span>);
            }
        }
        </span><span>catch</span>(<span>Exception</span> <span>$e</span><span>){
            </span><span>echo</span> <span>$e</span>.<span>getMessage();
            </span><span>exit</span><span>;
        }
    }</span>
ログイン後にコピー

  

  2. spl_autoload_register

  __autoload实际上也差不多了,但它是php定义的,如果现在有个东西写了并调用之后,就告诉程序说,我不用__autoload来加载文件了,我已经定义了一个专门加载文件的方法(比如名称是loadClass),以后需要加载一个类文件时,你就用它吧。spl_autoload_register就是这样一个能告诉程序这样去做的方法,而且自定义加载方法将会更灵活,可以指定多个加载函数,spl_autoload_register函数会将这些函数放在一个队列中,并激活它们,在调用时逐个激活:“If there must be multiple autoload functions, spl_autoload_register() allows for this. It effectively creates a queue of autoload functions, and runs through each of them in the order they are defined. ”,php.net上(http://php.net/manual/en/function.spl-autoload-register.php)也确实如此解释,spl_autoload_unregister则是从加载函数队列中注销。

  另外spl_autoload_functions()函数,可以获取我们注册了哪些函数;spl_autoload_call($class)函数,尝试调用所有已注册的加载函数来加载$class的类文件。

  对于spl_autoload_register的解释,我的理解是,如果用spl_autoload_register注册了n个函数在加载队列中,因为它自动激活它们嘛,现在我要实例化一个类,在第1个加载函数中加载失败了,然后尝试第2个函数,第二个失败则尝试第3个,''',直到第n个函数走完,若还没加载成功,就报错,只要中间一个加载成功就成功了,but事实好像有点出入。

  还是用上一个图片中的目录结构,

  1、在Controller目下创建indexController.php文件,包含类indexController;

  2、在Model目录下创建userModel.php文件,包含类userModel;

  3、首页写个类加载脚本Autoload.php,代码如下:

    <span>//</span><span> file: Autoload.php</span>
    <span>define</span>('DS',<span> DIRECTORY_SEPARATOR);
    </span><span>define</span>('ROOT', <span>rtrim</span>(<span>dirname</span>(<span>__FILE__</span>), '/\\').<span>DS);
    
    </span><span>class</span><span> Autoload{
        </span><span>public</span> <span>static</span> <span>function</span> autoloadRegister(<span>$loadFunc</span> = 'Autoload::loadControllerClass', <span>$enable</span> = <span>true</span><span>){
            </span><span>return</span> <span>$enable</span> ? spl_autoload_register(<span>$loadFunc</span>) : spl_autoload_unregister(<span>$loadFunc</span><span>);
        }
        </span><span>//</span><span> 加载控制器类</span>
        <span>public</span> <span>static</span> <span>function</span> loadControllerClass(<span>$className</span><span>){
            </span><span>if</span>(<span>file_exists</span>(ROOT.'Controller'.DS.<span>$className</span>.'.php')){<span>//</span><span> 检查Controller</span>
                <span>include</span>(ROOT.'Controller'.DS.<span>$className</span>.'.php'<span>);
                </span><span>echo</span> ROOT.'Controller'.DS.<span>$className</span>.'.php'.'<br/>'<span>;
            }
            </span><span>else</span><span>{
                </span><span>echo</span> "ERROR: can't find file {<span>$className</span>}.php in ".ROOT."Controller"<span>;
                </span><span>exit</span><span>;
            }
        }
        </span><span>//</span><span> 加载模型类</span>
        <span>public</span> <span>static</span> <span>function</span> loadModelClass(<span>$className</span><span>){
            </span><span>if</span>(<span>file_exists</span>(ROOT.'Model'.DS.<span>$className</span>.'.php')){<span>//</span><span> 检查Model</span>
                <span>include</span>(ROOT.'Model'.DS.<span>$className</span>.'.php'<span>);
                </span><span>echo</span> ROOT.'Model'.DS.<span>$className</span>.'.php'.'<br/>'<span>;
            }
            </span><span>else</span><span>{
                </span><span>echo</span> "ERROR: can't find file {<span>$className</span>}.php in ".ROOT."Model"<span>;
                </span><span>exit</span><span>;
            }
        }
    }</span>
ログイン後にコピー

  4、测试脚本,测试类是否能加载

    <span>//</span><span> 注册两个加载函数</span>
    Autoload::autoloadRegister('Autoload::loadControllerClass'<span>);
    Autoload</span>::autoloadRegister('Autoload::loadModelClass'<span>);</span><span>
    
    // 查看总共注册了哪些加载函数</span>
    <span>echo</span> 'register functions=> <pre class="brush:php;toolbar:false">'<span>;
    </span><span>print_r</span><span>(spl_autoload_functions());
    </span><span>//</span><span> 分别实例化一个Controller类和Model类</span>
    <span>$indexCon</span> = <span>new</span><span> indexController;
    </span><span>$userMod</span> = <span>new</span> userModel;
ログイン後にコピー

   结果是这样

  

  这不科学啊,spl_autoload_functions数组显示两个函数都注册了,但是当实例化userModel类时它还是跑到Controller目录中去找,两个类的实例化调用的自动加载方法都是Autoload::loadControllerClass,所以userModel类文件加载报错......注意到spl_autoload_register方法的第三个参数, 是添加一个加载函数时放在栈中的位置,于是我另写一个类似的类otherLoad,只是为了将loadModelClass方法放到队列首部:

    <span>class</span><span> otherLoad{
        </span><span>public</span> <span>static</span> <span>function</span> autoloadRegister(<span>$loadFunc</span> = 'otherLoad::loadModelClass', <span>$enable</span> = <span>true</span><span>){
            </span><span>//</span><span> 默认将loadModelClass放在队首</span>
            <span>return</span> <span>$enable</span> ? spl_autoload_register(<span>$loadFunc</span>, <span>true</span>, <span>true</span>) : spl_autoload_unregister(<span>$loadFunc</span><span>);
        }
        </span><span>//</span><span> 加载模型类</span>
        <span>public</span> <span>static</span> <span>function</span> loadModelClass(<span>$className</span><span>){
            </span><span>if</span>(<span>file_exists</span>(ROOT.'Model'.DS.<span>$className</span>.'.php')){<span>//</span><span> 检查Model</span>
                <span>include</span>(ROOT.'Model'.DS.<span>$className</span>.'.php'<span>);
                </span><span>echo</span> ROOT.'Model'.DS.<span>$className</span>.'.php'.'<br/>'<span>;
            }
            </span><span>else</span><span>{
                </span><span>echo</span> "ERROR: can't find file {<span>$className</span>}.php in ".ROOT."Model"<span>;
                </span><span>exit</span><span>;
            }
        }
    } </span>
ログイン後にコピー

  测试是这样

    <span>//</span><span> 注册三个加载函数</span>
    Autoload::autoloadRegister('Autoload::loadControllerClass'<span>);
    Autoload</span>::autoloadRegister('Autoload::loadModelClass'<span>);
    otherLoad</span>::autoloadRegister('otherLoad::loadModelClass'<span>);
    
    </span><span>//</span><span> 查看总共注册了哪些加载函数</span>
    <span>echo</span> 'register functions=> <pre class="brush:php;toolbar:false">'<span>;
    </span><span>print_r</span><span>(spl_autoload_functions());
    </span><span>//</span><span> 分别实例化一个Controller类和Model类</span>
    <span>$indexCon</span> = <span>new</span><span> indexController;
    </span><span>$userMod</span> = <span>new</span> userModel;
ログイン後にコピー

  这次的结果是这样:

  

  可以看到,这次是在加载indexController类时不成功,因为它只调用了loadModelClass方法,再看看spl_autoload_functions返回的数组,otherLoad类的loadModelClass方法在最前面,难道说,只有在加载函数队列最前面的函数才被用于自动加载,其他无效?这是什么状况?

  使用spl_autoload_call('indexController')来“尝试调用所有已注册的函数来装载请求类”,还是报这个错。

  翻了下别人的文章,包括github上的博客,也就是列举了下手册上说的“可以一次注册多个加载函数 bala bala......”,难道没有人试过,还是我的理解有问题>3<...(win下测试,php版本5.4.10)真是这样的话spl_autoload_register方法就没多大意义嘛╮(╯▽╰)╭......

  关于spl_autoload_register还有几个有意思的地方:

  1、 一个函数只会加载到函数队列中一次,重复加载也是如此;

  2、 spl_autoload_register如果不指定加载函数(第一个参数),则默认使用加载函数spl_autoload(功能类似于__autoload,是它的默认实现形式)

  3、 spl_autoload_register指定了__autoload为加载函数,则一定要实现__autoload;

  4、 同时实现了spl_autoload_register和__autoload,优先使用spl_autoload_register注册的加载函数。

  以上几种情况几乎都可从php.net的note中找到测试例子,老外写得挺有意思,可供参考。上面第2点还需要注意,比如现在在根目录创建一个目录,使用默认函数来加载:

    <span>//</span><span> 设置加载文件的扩展名,将只加载*.php的文件</span>
    spl_autoload_extensions('.php'<span>);
    </span><span>//</span><span> 默认使用spl_autoload加载文件,只能加载当前目录下文件:小写类名.php</span>
<span>    spl_autoload_register();
    </span><span>//</span><span> 测试
    // $obj = new A;</span>
ログイン後にコピー

  spl_autoload_extensions设置加载时只认哪些扩展类型的文件,默认是.php或者.inc文件,这里设置成.php,然后就是调用注册函数。在根目录下创建一个A.php文件,新建一个类A,加载成功,再将文件名改成a.php,照样加载成功。需要留意spl_autoload默认将类名转小写,但是A.php照样加载成功,因为Windows的文件是大小写不敏感的(在同一目录下创建一个d.txt,再创建D.txt会认为是同一个文件),对于Mac OS X也是这样,但Linux就是大小写敏感了,测试时要注意这点。

  也不是全要自动加载,如CI,它将加载文件封装为一个核心类CI_Loader,程序启动时先include必要的脚本(其他要用的核心类),然后再等需要使用时,CI_Loader实例作为当前控制器类或模型类等的一个属性成员,通过调用它的方法来include各种model(模型)、view(视图)、database(数据库对象)、helper(辅助函数)等等。

  无论用不用动态加载,必须保证的是,文件分门别类的放好,文件按一定规则命名,这是一个健壮、高扩展、高易用的project必备的,写起代码来也方便。当然加载文件的多少,占内存的多少,各有不同,也是评判一个框架的若干标准。弄清楚加载方式,熟悉一个框架结构不就是很容易的事了=_=...

 

  

 

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

0x80004005 エラー コードが表示された場合の対処方法 エディターは、0x80004005 エラー コードを解決する方法を説明します。 0x80004005 エラー コードが表示された場合の対処方法 エディターは、0x80004005 エラー コードを解決する方法を説明します。 Mar 21, 2024 pm 09:17 PM

パソコン上のフォルダーを削除または解凍するときに、「エラー 0x80004005: 不明なエラー」というダイアログ ボックスが表示されることがあります。この状況はどう解決すればよいでしょうか?エラー コード 0x80004005 が表示される理由は実際にはたくさんありますが、そのほとんどはウイルスによって引き起こされます。DLL を再登録して問題を解決できます。以下では、エディターがエラー コード 0x80004005 の処理体験を説明します。 。一部のユーザーは、コンピュータの使用時にエラー コード 0X80004005 を表示されます。0x80004005 エラーは主に、コンピュータが特定のダイナミック リンク ライブラリ ファイルを正しく登録していないこと、またはファイアウォールがコンピュータとインターネット間の HTTPS 接続を許可していないことが原因で発生します。それでどうですか

Quark Cloud Disk から Baidu Cloud Disk にファイルを転送するにはどうすればよいですか? Quark Cloud Disk から Baidu Cloud Disk にファイルを転送するにはどうすればよいですか? Mar 14, 2024 pm 02:07 PM

Quark Netdisk と Baidu Netdisk は現在、ファイルの保存に最も一般的に使用されている Netdisk ソフトウェアです。Quark Netdisk 内のファイルを Baidu Netdisk に保存したい場合は、どうすればよいですか?今回は、Quark Network Disk コンピュータから Baidu Network Disk にファイルを転送するためのチュートリアル手順を編集者がまとめたので、その操作方法を見てみましょう。 QuarkネットワークディスクファイルをBaiduネットワークディスクに保存するにはどうすればよいですか? Quark Network Disk から Baidu Network Disk にファイルを転送するには、まず Quark Network Disk から必要なファイルをダウンロードし、次に Baidu Network Disk クライアントでターゲット フォルダーを選択して開きます。次に、Quark Cloud Disk からダウンロードしたファイルを Baidu Cloud Disk クライアントによって開かれたフォルダーにドラッグ アンド ドロップするか、アップロード機能を使用してファイルを Baidu Cloud Disk に追加します。アップロードが完了したら、Baidu Cloud Disk にファイルが正常に転送されたかどうかを必ず確認してください。それでおしまい

hiberfil.sys ファイルとは何ですか? hiberfil.sysは削除できますか? hiberfil.sys ファイルとは何ですか? hiberfil.sysは削除できますか? Mar 15, 2024 am 09:49 AM

最近、多くのネチズンが編集者に「hiberfil.sys ファイルとは何ですか?」と尋ねました。 hiberfil.sys は C ドライブのスペースを多く消費し、削除される可能性がありますか?エディターは、hiberfil.sys ファイルを削除できることを通知します。以下で詳細を見てみましょう。 hiberfil.sys は Windows システムの隠しファイルであり、システム休止状態ファイルでもあります。通常、C ドライブのルート ディレクトリに保存され、そのサイズはシステムに搭載されているメモリのサイズと同等です。このファイルはコンピュータが休止状態になっているときに使用され、リカバリ中に以前の状態にすばやく復元できるように、現在のシステムのメモリ データが含まれています。そのサイズはメモリ容量と等しいため、より多くのハードドライブスペースを占有する可能性があります。冬休み

MySQLにおける.ibdファイルの役割と注意事項について詳しく解説 MySQLにおける.ibdファイルの役割と注意事項について詳しく解説 Mar 15, 2024 am 08:00 AM

MySQL における .ibd ファイルの役割とそれに関連する注意事項の詳細な説明 MySQL は人気のあるリレーショナル データベース管理システムであり、データベース内のデータは別のファイルに保存されます。このうち、.ibd ファイルは InnoDB ストレージ エンジンのデータ ファイルであり、データとインデックスをテーブルに保存するために使用されます。この記事では、MySQL における .ibd ファイルの役割を詳細に分析し、読者の理解を深めるために関連するコード例を示します。 1. .ibd ファイルの役割: データの保存: .ibd ファイルは InnoDB ストレージです

20 倍ズームを備えた 3 台のカメラ、Honor が Xiaopai Smart Camera Pro を選択 イノベーションが到来 20 倍ズームを備えた 3 台のカメラ、Honor が Xiaopai Smart Camera Pro を選択 イノベーションが到来 Aug 23, 2024 pm 09:44 PM

あなたの家にカメラを設置しましたか?近年、家庭用カメラ製品がにわかにヒットしています。周りの友達に聞いてみると、どこの家にも一台はあるし、複数持っている家もあるそうです。しかし、この製品の人気に伴い、使用中にいくつかの不満も生じています。たとえば、同時に見ることができるのは 1 つの場所だけであり、他の場所を見たい場合は、パン/チルトを調整し、カメラを前後に回転する必要があります。観察時には一定の死角と時間差が生じます。または、家の特定の場所を詳しく見たいときに、画像がぼやけていてまったく見えないなど、鮮明さが大幅に損なわれます。 Honor Select と Xiaopai Technology は共同で、「3 つのレンズとデュアル画像」を特徴とする Honor Select Xiaopai スマート カメラ プロを発売しました。業界とユーザーの問題点に対する新しいソリューションを提供します

Linuxシステムのログ閲覧コマンドを詳しく解説! Linuxシステムのログ閲覧コマンドを詳しく解説! Mar 06, 2024 pm 03:55 PM

Linux システムでは、次のコマンドを使用してログ ファイルの内容を表示できます。 tail コマンド: tail コマンドは、ログ ファイルの末尾の内容を表示するために使用されます。最新のログ情報を表示するための一般的なコマンドです。 tail [オプション] [ファイル名] 一般的に使用されるオプションは次のとおりです。 -n: 表示する行数を指定します。デフォルトは 10 行です。 -f: ファイルの内容をリアルタイムで監視し、ファイルが更新されたときに新しい内容を自動的に表示します。例: tail-n20logfile.txt#logfile.txt ファイルの最後の 20 行を表示 tail-flogfile.txt#logfile.txt ファイルの更新された内容をリアルタイムで監視 head コマンド: head コマンドは先頭を表示するために使用されます。ログファイルの

Linux の「.a」ファイルを作成して実行する Linux の「.a」ファイルを作成して実行する Mar 20, 2024 pm 04:46 PM

Linux オペレーティング システムでファイルを操作するには、開発者がファイル、コード、プログラム、スクリプトなどを効率的に作成および実行できるようにするさまざまなコマンドとテクニックを使用する必要があります。 Linux 環境では、拡張子「.a」を持つファイルは静的ライブラリとして非常に重要です。これらのライブラリはソフトウェア開発において重要な役割を果たし、開発者が複数のプログラム間で共通の機能を効率的に管理および共有できるようにします。 Linux 環境で効果的なソフトウェア開発を行うには、「.a」ファイルの作成方法と実行方法を理解することが重要です。この記事では、Linux の「.a」ファイルのインストールと構成方法を包括的に紹介します。Linux の「.a」ファイルの定義、目的、構造、作成および実行方法について見てみましょう。 Lとは何ですか

Go 言語ファイルの名前変更操作の完全な分析 Go 言語ファイルの名前変更操作の完全な分析 Apr 08, 2024 pm 03:30 PM

os.Rename 関数は Go 言語でファイルの名前を変更するために使用されます。構文は funcRename(oldpath,newpathstring)error です。この関数は、oldpath で指定されたファイルの名前を newpath で指定されたファイルに変更します。例としては、単純な名前変更、ファイルの別のディレクトリへの移動、エラー処理の無視などが挙げられます。名前変更機能はアトミック操作を実行し、2 つのファイルが同じディレクトリにある場合にのみディレクトリ エントリを更新する可能性があります。名前変更はボリューム間またはファイルの使用中に失敗する可能性があります。

See all articles