国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ バックエンド開発 PHPチュートリアル ファイルの読み込み - プロジェクトを理解するための最初のステップ

ファイルの読み込み - プロジェクトを理解するための最初のステップ

Jun 13, 2016 pm 12:15 PM
autoload include nbsp php

ファイルのロード --- プロジェクトを理解するための最初のステップ

初めて PHP を書き始めたとき、私はいつもこの問題について心配していました。ここで作成した新しいクラスは、対応するクラス ファイルにロードできるでしょうか?結(jié)局のところ、致命的エラーは、実行するとすぐに報告されます。** ファイルが見つからない、クラスをインスタンス化できないなどです。これは非常に「低レベル」のエラーであり、他の人が読むのではないかと心配しています。それは冗談です。そのため、新しいタスクを引き受けるたびに、その読み込みプロセスを理解したいと考えています (以前は HTML タグとスタイルをいくつかしか知らなかったので、それが Web 開発としてカウントされるかどうかはわかりません)。それを読んで、まだこれを読む時間があると言うので、彼はすぐにロジックを書き、これを?qū)g行してください...あなたの妹、もちろん、あなたはそれを確信していますD:、しかし後でプロセスが似ていることがわかりました。

C/Java などの IDE で開発する場合、通常は新しいプロジェクトを作成し、IDE を通じて指定されたディレクトリに新しいファイルを追加し、それを #include/Import します。PHP がこの手順を?qū)g行します。より手順的に言えば、ファイル読み込みプロセスは基本的に、プロジェクト (フレームワークまたは自己構(gòu)築プロジェクト) のディレクトリ構(gòu)造とファイル分類を決定します。

フレームワークでも、自作プロジェクトでも、この時點で、設定ファイルや一般的なメソッドなど、いくつかの基本情報を事前にロードする必要があります。単一のファイルを手動で直接ロードする方法です。次の 4 つの方法のいずれかを使用します。

include、require、include_once、require_once

    <span style="color: #0000ff;">include</span>('config.php'<span style="color: #000000;">);    </span><span style="color: #0000ff;">require</span>('database.php');

クラスファイルのうち、直接ロードされるのは少數(shù)です。たとえば、一般的なメソッドです。これは、後で使用されるメソッド(エラー出力、curl リクエスト、ランダムなど)であるため、クラス Utilities の靜的メソッドとして記述されます。文字列の生成...)、これはクラスにカプセル化されており、通常、

include('Utilities.php'); でロードするときに使用されます。クラスの動的ロードです。まず、ロード メソッドについては觸れません。クラスとインスタンスがいつ使用されるかを見てみましょう。

1. 最も明白な $obj = new A; そのバリアント $className = 'A' ; $obj = $className; すべて同じ;

2. クラスの靜的メソッド、靜的変數(shù)、定數(shù)、つまり Utilities::$instance、Utilities::HOST の呼び出し;

3. PHP 関數(shù)では、コールバック関數(shù)が使用されます。最も一般的なのは、配列內(nèi)の array_walk や array_map など、コールバックが使用される場所です。コールバック関數(shù)をパラメータとして使用します。

コールバック関數(shù)は非常に柔軟であり、単純な関數(shù)だけでなく、靜的クラス メソッドを含むオブジェクト メソッドにすることもできます。オブジェクト メソッドまたは靜的メソッドを使用できるため、この時點で対応するクラス ファイルを読み込む必要があります。 php5.3からはjsと同様に匿名関數(shù)を使ってコールバック関數(shù)も実裝できるようになりました。

     <span style="color: #0000ff;">class</span><span style="color: #000000;"> A{         </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> cube(<span style="color: #800080;">$var</span><span style="color: #000000;">){             </span><span style="color: #0000ff;">return</span> <span style="color: #008080;">pow</span>(<span style="color: #800080;">$var</span>, 3<span style="color: #000000;">);         }                  </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> twice(<span style="color: #800080;">$var</span><span style="color: #000000;">){             </span><span style="color: #0000ff;">return</span> 2*<span style="color: #800080;">$var</span><span style="color: #000000;">;         }     }     </span><span style="color: #008000;">//</span><span style="color: #008000;"> 使用類的靜態(tài)方法</span>     <span style="color: #800080;">$num</span> = <span style="color: #008080;">call_user_func</span>('A::cube', 5<span style="color: #000000;">);     </span><span style="color: #008000;">//</span><span style="color: #008000;"> 使用對象</span>     <span style="color: #800080;">$obj</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> A;     </span><span style="color: #800080;">$num</span> = <span style="color: #008080;">call_user_func_array</span>(<span style="color: #0000ff;">array</span>(<span style="color: #800080;">$obj</span>, 'twice'), <span style="color: #0000ff;">array</span>(7));
厳密に言えば、上記の例の call_user_func_array はオブジェクトをインスタンス化していますが、このような使い方があり、クラスの靜的メソッドを使用することもできます。

まず最初に理解すべきことは、なぜ動的読み込みが必要なのかということです。 PHP はスクリプト言語です。たとえば、localhost/index として直接アクセスすると、ルート ディレクトリにindex.php ファイルが存在します。 php にあるすべてのリソースにアクセスできます。index.php で共通のクラス A が定義されている場合、A のオブジェクトがスクリプト內(nèi)でインスタンス化されると、プログラムは次のように反応します。 A の定義を作成し、それを直接インスタンス化できます (他のファイルをロードする必要はありません)。クラスB、C、Dなどたくさんのクラスがある場合、それらをすべてindex.phpに書いて別のファイルに書いてインクルードすると當然動作しません(インクルードはすでに読み込み作業(yè)を行っています)。プログラムでは機能しません。これも「表示」されます。

しかし、システムの機能が増えるにつれてクラスの數(shù)も増え、各クラスの機能も異なり、データベースの動作を直接定義するもの、データベースのデータを読み取るもの、制御するものなどがあります。スクリプトにアクセスするときに実行されるメソッド。一部は表示されるページであり、一部は參照するサードパーティのコア ライブラリです。したがって、すべてのファイルをディレクトリに配置すると、それらは include によって直接ロードできます。これらのファイルの配置は亂雑でわかりにくく、メンテナンスのコストも高くなります。さて、ルート ディレクトリにさらにいくつかのディレクトリを作成しましょう。ディレクトリ A は、データベースを処理するスクリプトの保存専用です。ディレクトリ C は、プログラム開始時のエントリ制御方法を制御します。スクリプト、ディレクトリ D はブラウザに表示されるページです...

  于是MVC架構(gòu)慢慢就演化出來了,我們不能再像以前那樣直接include,腳本都放在特定的目錄下,如Controller目錄下存放的是各種控制器,加載控制器時,我們得這樣include('root/Controller/indexController.php'),每次都在文件前面弄一大串的include不僅看著頭疼,簡直讓人累覺不愛。既然有了獲取當前文件路徑和類名的現(xiàn)成方法,為何不將類名與文件名對應起來,而只要是控制器類的腳本就全放在根目錄的Controller子目錄下邊,就可以寫一個方法,只要是控制器類,在這個方法中運行include(ROOT.'Controller/'.$className.'.php');這一句,ROOT為根目錄常量,$className為傳入的類名,只要是模型類,就這樣include(ROOT.'Model/'.$className.'.php');,全憑這個函數(shù)來動態(tài)控制到哪個目錄里邊去找,這個project可能就是這樣的:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

  無形中,就建立起了類名和文件名的對應規(guī)則,文件和所在的目錄的對應規(guī)則,該project下有哪些這樣的目錄和文件呢?啊原來是放控制器的Controller、放配置信息的Config等等,再次于無形中得知了這個project的結(jié)構(gòu),而上面說的,利用函數(shù)根據(jù)一定條件(傳入?yún)?shù))可知自動到哪個目錄下去加載該文件,而不是一個個寫死的include,就是所謂的文件的動態(tài)加載了。

  因此,當你要新建一個**類文件時,也就知道,哦在這個project中,我應該放在這個目錄下,文件的命名應該與類名相同,這樣就一定能加載到了~~~接下來就是寫業(yè)務邏輯的一個“愉快的過程”。

  知道什么時候會動態(tài)加載及為什么要動態(tài)加載后,接下來就是來實現(xiàn)了,也就是上面說到的利用函數(shù)來加載某個文件,就是要寫好這個“函數(shù)”來實現(xiàn)這個過程。常用的有三種方式:

  1. __autoload

  我第一次學的時候就是用的就是這個,魔術(shù)函數(shù),只要定義了php程序就會在要用到一個類時自動調(diào)用它進行文件動態(tài)加載,一樣,既然它是個函數(shù),就要讓程序?qū)_autoload的定義可見,不然從哪兒調(diào)用它呢?一般來說,作為后邊程序大部分地方要用到的方法,我們都會放在一個單獨的文件中,在程序的入口處加載進來,一個project總得有幾個文件是手動include的,完全可以在開頭單獨include進來,或者放在配置信息中,加載配置信息時就加載進來了。它的原型:

  void?__autoload?(?string $class?)

  參數(shù)當前加載的類名名稱(注意如果有命名空間,則包含命名空間前綴),下面是一個針對上面的圖片結(jié)構(gòu)的簡單示例:

    <span style="color: #008000;">//</span><span style="color: #008000;"> file: autoload.php     // ROOT為已經(jīng)定義的根目錄常量</span>    <span style="color: #0000ff;">function</span> __autoload(<span style="color: #800080;">$className</span><span style="color: #000000;">){        </span><span style="color: #0000ff;">try</span><span style="color: #000000;">{            </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">file_exists</span>(ROOT.'Controller/'.<span style="color: #800080;">$className</span>.'.php')){<span style="color: #008000;">//</span><span style="color: #008000;"> 檢查Controller</span>                <span style="color: #0000ff;">include</span>(ROOT.'Controller/'.<span style="color: #800080;">$className</span>.'.php'<span style="color: #000000;">);            }            </span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span>(<span style="color: #008080;">file_exists</span>(ROOT.'Model/'.<span style="color: #800080;">$className</span>.'.php')){<span style="color: #008000;">//</span><span style="color: #008000;"> 檢查Model</span>                <span style="color: #0000ff;">include</span>(ROOT.'Model/'.<span style="color: #800080;">$className</span>.'.php'<span style="color: #000000;">);            }            </span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span>(<span style="color: #008080;">file_exists</span>(ROOT.'Lib/'.<span style="color: #800080;">$className</span>.'.php')){<span style="color: #008000;">//</span><span style="color: #008000;"> 檢查Lib</span>                <span style="color: #0000ff;">include</span>(ROOT.'Lib/'.<span style="color: #800080;">$className</span>.'.php'<span style="color: #000000;">);            }            </span><span style="color: #0000ff;">else</span>{                                               <span style="color: #008000;">//</span><span style="color: #008000;"> 找不到該文件</span>                <span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">Exception</span>("ERROR: can't find file {<span style="color: #800080;">$className</span>}.php"<span style="color: #000000;">);            }        }        </span><span style="color: #0000ff;">catch</span>(<span style="color: #0000ff;">Exception</span> <span style="color: #800080;">$e</span><span style="color: #000000;">){            </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$e</span>.<span style="color: #000000;">getMessage();            </span><span style="color: #0000ff;">exit</span><span style="color: #000000;">;        }    }</span>

?  

  2. spl_autoload_register

  __autoload實際上也差不多了,但它是php定義的,如果現(xiàn)在有個東西寫了并調(diào)用之后,就告訴程序說,我不用__autoload來加載文件了,我已經(jīng)定義了一個專門加載文件的方法(比如名稱是loadClass),以后需要加載一個類文件時,你就用它吧。spl_autoload_register就是這樣一個能告訴程序這樣去做的方法,而且自定義加載方法將會更靈活,可以指定多個加載函數(shù),spl_autoload_register函數(shù)會將這些函數(shù)放在一個隊列中,并激活它們,在調(diào)用時逐個激活:“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則是從加載函數(shù)隊列中注銷。

  另外spl_autoload_functions()函數(shù),可以獲取我們注冊了哪些函數(shù);spl_autoload_call($class)函數(shù),嘗試調(diào)用所有已注冊的加載函數(shù)來加載$class的類文件。

  對于spl_autoload_register的解釋,我的理解是,如果用spl_autoload_register注冊了n個函數(shù)在加載隊列中,因為它自動激活它們嘛,現(xiàn)在我要實例化一個類,在第1個加載函數(shù)中加載失敗了,然后嘗試第2個函數(shù),第二個失敗則嘗試第3個,''',直到第n個函數(shù)走完,若還沒加載成功,就報錯,只要中間一個加載成功就成功了,but事實好像有點出入。

  還是用上一個圖片中的目錄結(jié)構(gòu),

  1、在Controller目下創(chuàng)建indexController.php文件,包含類indexController;

  2、在Model目錄下創(chuàng)建userModel.php文件,包含類userModel;

  3、首頁寫個類加載腳本Autoload.php,代碼如下:

    <span style="color: #008000;">//</span><span style="color: #008000;"> file: Autoload.php</span>    <span style="color: #008080;">define</span>('DS',<span style="color: #000000;"> DIRECTORY_SEPARATOR);    </span><span style="color: #008080;">define</span>('ROOT', <span style="color: #008080;">rtrim</span>(<span style="color: #008080;">dirname</span>(<span style="color: #ff00ff;">__FILE__</span>), '/\\').<span style="color: #000000;">DS);        </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Autoload{        </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> autoloadRegister(<span style="color: #800080;">$loadFunc</span> = 'Autoload::loadControllerClass', <span style="color: #800080;">$enable</span> = <span style="color: #0000ff;">true</span><span style="color: #000000;">){            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$enable</span> ? spl_autoload_register(<span style="color: #800080;">$loadFunc</span>) : spl_autoload_unregister(<span style="color: #800080;">$loadFunc</span><span style="color: #000000;">);        }        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 加載控制器類</span>        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> loadControllerClass(<span style="color: #800080;">$className</span><span style="color: #000000;">){            </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">file_exists</span>(ROOT.'Controller'.DS.<span style="color: #800080;">$className</span>.'.php')){<span style="color: #008000;">//</span><span style="color: #008000;"> 檢查Controller</span>                <span style="color: #0000ff;">include</span>(ROOT.'Controller'.DS.<span style="color: #800080;">$className</span>.'.php'<span style="color: #000000;">);                </span><span style="color: #0000ff;">echo</span> ROOT.'Controller'.DS.<span style="color: #800080;">$className</span>.'.php'.'<br/>'<span style="color: #000000;">;            }            </span><span style="color: #0000ff;">else</span><span style="color: #000000;">{                </span><span style="color: #0000ff;">echo</span> "ERROR: can't find file {<span style="color: #800080;">$className</span>}.php in ".ROOT."Controller"<span style="color: #000000;">;                </span><span style="color: #0000ff;">exit</span><span style="color: #000000;">;            }        }        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 加載模型類</span>        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> loadModelClass(<span style="color: #800080;">$className</span><span style="color: #000000;">){            </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">file_exists</span>(ROOT.'Model'.DS.<span style="color: #800080;">$className</span>.'.php')){<span style="color: #008000;">//</span><span style="color: #008000;"> 檢查Model</span>                <span style="color: #0000ff;">include</span>(ROOT.'Model'.DS.<span style="color: #800080;">$className</span>.'.php'<span style="color: #000000;">);                </span><span style="color: #0000ff;">echo</span> ROOT.'Model'.DS.<span style="color: #800080;">$className</span>.'.php'.'<br/>'<span style="color: #000000;">;            }            </span><span style="color: #0000ff;">else</span><span style="color: #000000;">{                </span><span style="color: #0000ff;">echo</span> "ERROR: can't find file {<span style="color: #800080;">$className</span>}.php in ".ROOT."Model"<span style="color: #000000;">;                </span><span style="color: #0000ff;">exit</span><span style="color: #000000;">;            }        }    }</span>

  4、測試腳本,測試類是否能加載

    <span style="color: #008000;">//</span><span style="color: #008000;"> 注冊兩個加載函數(shù)</span>    Autoload::autoloadRegister('Autoload::loadControllerClass'<span style="color: #000000;">);    Autoload</span>::autoloadRegister('Autoload::loadModelClass'<span style="color: #000000;">);</span><span style="color: #008000;">        // 查看總共注冊了哪些加載函數(shù)</span>    <span style="color: #0000ff;">echo</span> 'register functions=> <pre class="brush:php;toolbar:false">'<span style="color: #000000;">;    </span><span style="color: #008080;">print_r</span><span style="color: #000000;">(spl_autoload_functions());    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 分別實例化一個Controller類和Model類</span>    <span style="color: #800080;">$indexCon</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> indexController;    </span><span style="color: #800080;">$userMod</span> = <span style="color: #0000ff;">new</span> userModel;

  ?結(jié)果是這樣

  ??

  這不科學啊,spl_autoload_functions數(shù)組顯示兩個函數(shù)都注冊了,但是當實例化userModel類時它還是跑到Controller目錄中去找,兩個類的實例化調(diào)用的自動加載方法都是Autoload::loadControllerClass,所以userModel類文件加載報錯......注意到spl_autoload_register方法的第三個參數(shù), 是添加一個加載函數(shù)時放在棧中的位置,于是我另寫一個類似的類otherLoad,只是為了將loadModelClass方法放到隊列首部:

    <span style="color: #0000ff;">class</span><span style="color: #000000;"> otherLoad{        </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> autoloadRegister(<span style="color: #800080;">$loadFunc</span> = 'otherLoad::loadModelClass', <span style="color: #800080;">$enable</span> = <span style="color: #0000ff;">true</span><span style="color: #000000;">){            </span><span style="color: #008000;">//</span><span style="color: #008000;"> 默認將loadModelClass放在隊首</span>            <span style="color: #0000ff;">return</span> <span style="color: #800080;">$enable</span> ? spl_autoload_register(<span style="color: #800080;">$loadFunc</span>, <span style="color: #0000ff;">true</span>, <span style="color: #0000ff;">true</span>) : spl_autoload_unregister(<span style="color: #800080;">$loadFunc</span><span style="color: #000000;">);        }        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 加載模型類</span>        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> loadModelClass(<span style="color: #800080;">$className</span><span style="color: #000000;">){            </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">file_exists</span>(ROOT.'Model'.DS.<span style="color: #800080;">$className</span>.'.php')){<span style="color: #008000;">//</span><span style="color: #008000;"> 檢查Model</span>                <span style="color: #0000ff;">include</span>(ROOT.'Model'.DS.<span style="color: #800080;">$className</span>.'.php'<span style="color: #000000;">);                </span><span style="color: #0000ff;">echo</span> ROOT.'Model'.DS.<span style="color: #800080;">$className</span>.'.php'.'<br/>'<span style="color: #000000;">;            }            </span><span style="color: #0000ff;">else</span><span style="color: #000000;">{                </span><span style="color: #0000ff;">echo</span> "ERROR: can't find file {<span style="color: #800080;">$className</span>}.php in ".ROOT."Model"<span style="color: #000000;">;                </span><span style="color: #0000ff;">exit</span><span style="color: #000000;">;            }        }    } </span>

  測試是這樣

    <span style="color: #008000;">//</span><span style="color: #008000;"> 注冊三個加載函數(shù)</span>    Autoload::autoloadRegister('Autoload::loadControllerClass'<span style="color: #000000;">);    Autoload</span>::autoloadRegister('Autoload::loadModelClass'<span style="color: #000000;">);    otherLoad</span>::autoloadRegister('otherLoad::loadModelClass'<span style="color: #000000;">);        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 查看總共注冊了哪些加載函數(shù)</span>    <span style="color: #0000ff;">echo</span> 'register functions=> <pre class="brush:php;toolbar:false">'<span style="color: #000000;">;    </span><span style="color: #008080;">print_r</span><span style="color: #000000;">(spl_autoload_functions());    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 分別實例化一個Controller類和Model類</span>    <span style="color: #800080;">$indexCon</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> indexController;    </span><span style="color: #800080;">$userMod</span> = <span style="color: #0000ff;">new</span> userModel;

  這次的結(jié)果是這樣:

  

  可以看到,這次是在加載indexController類時不成功,因為它只調(diào)用了loadModelClass方法,再看看spl_autoload_functions返回的數(shù)組,otherLoad類的loadModelClass方法在最前面,難道說,只有在加載函數(shù)隊列最前面的函數(shù)才被用于自動加載,其他無效?這是什么狀況?

  使用spl_autoload_call('indexController')來“嘗試調(diào)用所有已注冊的函數(shù)來裝載請求類”,還是報這個錯。

  翻了下別人的文章,包括github上的博客,也就是列舉了下手冊上說的“可以一次注冊多個加載函數(shù) bala bala......”,難道沒有人試過,還是我的理解有問題>3<...(win下測試,php版本5.4.10)真是這樣的話spl_autoload_register方法就沒多大意義嘛╮(╯▽╰)╭......

  關(guān)于spl_autoload_register還有幾個有意思的地方:

  1、 一個函數(shù)只會加載到函數(shù)隊列中一次,重復加載也是如此;

  2、 spl_autoload_register如果不指定加載函數(shù)(第一個參數(shù)),則默認使用加載函數(shù)spl_autoload(功能類似于__autoload,是它的默認實現(xiàn)形式)

  3、 spl_autoload_register指定了__autoload為加載函數(shù),則一定要實現(xiàn)__autoload;

  4、 同時實現(xiàn)了spl_autoload_register和__autoload,優(yōu)先使用spl_autoload_register注冊的加載函數(shù)。

  以上幾種情況幾乎都可從php.net的note中找到測試例子,老外寫得挺有意思,可供參考。上面第2點還需要注意,比如現(xiàn)在在根目錄創(chuàng)建一個目錄,使用默認函數(shù)來加載:

    <span style="color: #008000;">//</span><span style="color: #008000;"> 設置加載文件的擴展名,將只加載*.php的文件</span>    spl_autoload_extensions('.php'<span style="color: #000000;">);    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 默認使用spl_autoload加載文件,只能加載當前目錄下文件:小寫類名.php</span><span style="color: #000000;">    spl_autoload_register();    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 測試    // $obj = new A;</span>

  spl_autoload_extensions設置加載時只認哪些擴展類型的文件,默認是.php或者.inc文件,這里設置成.php,然后就是調(diào)用注冊函數(shù)。在根目錄下創(chuàng)建一個A.php文件,新建一個類A,加載成功,再將文件名改成a.php,照樣加載成功。需要留意spl_autoload默認將類名轉(zhuǎn)小寫,但是A.php照樣加載成功,因為Windows的文件是大小寫不敏感的(在同一目錄下創(chuàng)建一個d.txt,再創(chuàng)建D.txt會認為是同一個文件),對于Mac OS X也是這樣,但Linux就是大小寫敏感了,測試時要注意這點。

  也不是全要自動加載,如CI,它將加載文件封裝為一個核心類CI_Loader,程序啟動時先include必要的腳本(其他要用的核心類),然后再等需要使用時,CI_Loader實例作為當前控制器類或模型類等的一個屬性成員,通過調(diào)用它的方法來include各種model(模型)、view(視圖)、database(數(shù)據(jù)庫對象)、helper(輔助函數(shù))等等。

動的読み込みが使用されているかどうかに関係なく、ファイルがカテゴリに配置され、特定のルールに従ってファイルに名前が付けられていることを確認する必要があります。これは、堅牢で拡張性が高く、使いやすいファイルに必須です。 -プロジェクトを使用すると、コードを書くのにも便利です。もちろん、ロードされるファイルの數(shù)や占有メモリの量は人によって異なり、フレームワークを判斷する基準にもなります。読み込み方法を理解して、フレームワークの構(gòu)造に慣れるのは簡単ではありませんか=_=...

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

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

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 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

PHPバージョンをアップグレードする方法は? PHPバージョンをアップグレードする方法は? Jun 27, 2025 am 02:14 AM

PHPバージョンのアップグレードは実際には難しくありませんが、鍵は操作手順と予防策にあります。以下は特定の方法です。1?,F(xiàn)在のPHPバージョンと実行環(huán)境を確認し、コマンドラインまたはPHPINFO.PHPファイルを使用して表示します。 2。適切な新しいバージョンを選択してインストールします。 8.2または8.1でインストールすることをお勧めします。 Linuxユーザーはパッケージマネージャーを使用し、MacOSユーザーはHomeBrewを使用します。 3.構(gòu)成ファイルと拡張機能を移行し、php.iniを更新し、必要な拡張機能をインストールします。 4.ウェブサイトが正常に実行されているかどうかをテストするには、エラーログを確認して、互換性の問題がないことを確認してください。これらの手順に従うと、ほとんどの狀況でアップグレードを正常に完了できます。

PHPでのクロスサイトリクエスト偽造(CSRF)攻撃を防ぐにはどうすればよいですか? PHPでのクロスサイトリクエスト偽造(CSRF)攻撃を防ぐにはどうすればよいですか? Jun 28, 2025 am 02:25 AM

topreventcsrfattacksinphp、demifficanti-csrftokens.1)生成と測定と測定を繰り返し、orbin2hex(random_bytes(32))、savethemin $ _ session、andincludeTheminformsashdidnputs.2)

PHP初心者ガイド:ローカル環(huán)境構(gòu)成の詳細な説明 PHP初心者ガイド:ローカル環(huán)境構(gòu)成の詳細な説明 Jun 27, 2025 am 02:09 AM

PHP開発環(huán)境をセットアップするには、適切なツールを選択し、構(gòu)成を正しくインストールする必要があります。 phpの最も基本的なPHPローカル環(huán)境には、3つのコンポーネントが必要です。Webサーバー(ApacheまたはNginx)、PHP自體、およびデータベース(MySQL/Mariadbなど)。 biter初心者は、インストールプロセスを簡素化するXAMPPやMAMPなどの統(tǒng)合パッケージを使用することをお勧めします。 XAMPPは、WindowsとMacOSに適しています。インストール後、プロジェクトファイルはHTDOCSディレクトリに配置され、LocalHostからアクセスされます。 mampはMacユーザーに適しており、PHPバージョンの便利なスイッチングをサポートしていますが、無料版の機能は限られています。 Advanced Advancedユーザーは、Macos/LinuxシステムでHomebrewによって手動でそれらをインストールできます

2つのPHPアレイを組み合わせる方法ユニークな値は? 2つのPHPアレイを組み合わせる方法ユニークな値は? Jul 02, 2025 pm 05:18 PM

2つのPHPアレイをマージし、一意の値を保持するには、2つの主要な方法があります。 1.インデックスアレイまたは重複排除のみの場合、array_mergeとarray_uniqueの組み合わせを使用します:最初のマージArray_merge($ array1、$ array2)を使用してから、array_unique()を使用して、最終的にすべての一意の値を含む新しいアレイを取得します。 2。関連アレイと最初の配列のキー値のペアを保持したい場合は、演算子を使用してください。$ result = $ array1 $ array2。これらの2つの方法は、キー名が保持されているか焦點があるかに応じて、異なるシナリオに適用できます。

PHP出口機能の使用方法は? PHP出口機能の使用方法は? Jul 03, 2025 am 02:15 AM

Exit()は、すぐにスクリプトの実行を終了するために使用されるPHPの関數(shù)です。一般的な用途には次のものが含まれます。1。ファイルが存在しない、または検証が失敗するなど、例外が検出されたときにスクリプトを事前に終了します。 2。デバッグ中の出力中間結(jié)果と実行を停止します。 3。Header()と組み合わせてリダイレクトした後、Exit()を呼び出して、後続のコード実行を防ぎます。さらに、exit()は、文字列パラメーターを出力コンテンツまたはステータスコードとして整數(shù)として受け入れることができ、そのエイリアスはdie()です。

HTMLで記事、セクション、および脇にセマンティック構(gòu)造を適用する HTMLで記事、セクション、および脇にセマンティック構(gòu)造を適用する Jul 05, 2025 am 02:03 AM

HTMLでのセマンティックタグの合理的な使用は、ページ構(gòu)造の明確さ、アクセシビリティ、SEO効果を改善することができます。 1.ブログの投稿やコメントなどの獨立したコンテンツブロックに使用されると、自己完結(jié)型でなければなりません。 2。通常はタイトルを含む分類関連のコンテンツに使用され、ページのさまざまなモジュールに適しています。 3。サイドバーの推奨事項や著者プロファイルなど、メインコンテンツに関連する補助情報に使用されますが、コアではありません。実際の開発では、ラベルを組み合わせて、その他を組み合わせ、過度のネストを避け、構(gòu)造をシンプルに保ち、開発者ツールを使用して構(gòu)造の合理性を検証する必要があります。

PHPのセッションデータにアクセスするにはどうすればよいですか? PHPのセッションデータにアクセスするにはどうすればよいですか? Jun 30, 2025 am 01:33 AM

PHPのセッションデータにアクセスするには、最初にセッションを開始し、次に$ _Session HyperGlobal Arrayを介して動作する必要があります。 1。セッションはsession_start()を使用して開始する必要があり、出力の前に関數(shù)を呼び出す必要があります。 2。セッションデータにアクセスするときは、キーが存在するかどうかを確認します。 ISSET($ _ Session ['key'])またはarray_key_exists( 'key'、$ _ session)を使用できます。 3.セッション変數(shù)を設定または更新する必要は、手動で保存せずに$ _Sessionアレイに値を割り當てるだけです。 4. unset($ _ session ['key'])を使用した特定のデータをクリアし、すべてのデータをクリアし、空の配列に$ _sessionを設定します。

PHPの再帰機能とは何ですか? PHPの再帰機能とは何ですか? Jun 29, 2025 am 02:02 AM

再帰関數(shù)は、PHPのセルフコール関數(shù)を指します。コア要素は1です。終了條件(基本例)の定義、2。問題を分解し、再帰的に呼び出す(再帰的な例)。階層構(gòu)造を扱う、重複したサブ問題の分解、または計算の要因、走査ディレクトリなどのコード読みやすさの改善に適しています。ただし、メモリ消費とスタックオーバーフローのリスクに注意を払う必要があります。書くときは、出口條件を明確にする必要があり、基本的な例に徐々にアプローチし、冗長パラメーターを避け、小さな入力をテストする必要があります。たとえば、ディレクトリをスキャンすると、関數(shù)はサブディレクトリに遭遇し、すべてのレベルが橫斷されるまで再帰的に呼び出します。

See all articles