ホームページ  >  記事  >  バックエンド開発  >  PHP フレームワークを自分で書く方法

PHP フレームワークを自分で書く方法

WBOY
WBOYオリジナル
2016-06-13 13:02:521139ブラウズ

PHP フレームワークを自分で書く方法
[size=small][color=darkred] PHP フォーラムでは、PHP の OOP サポートについて、欠陥や欠陥があるが、実際的な例は何も提供できないという無責任な発言をする人々をいつも聞きます。もともとこのことについてお話したいと申し上げていたのですが、大変忙しくて時間が取れてしまったので、先ほど取り組んだプロジェクトのフレームワークを取り出してお話しさせていただきます。このプロジェクトのコードの 99% は OOP で書かれており、PHP は OOP を非常によくサポートしていると感じます。プロジェクト自体は商用プロジェクトなのでソースコードを公開するのは難しいですが、それでも基本的な枠組みは説明できますし、簡略化したサンプルの方が理解しやすいです。 PHP の OOP についてあまり詳しくない場合は、ここでやめて、最初にマニュアルまたは基本的な資料を読むことをお勧めします。とにかく、これは脚がなければ実行できない記事です。

簡単に言うと、今すぐ始めましょう。ここでは、関数が 1 つ半しかない簡単な例を使用します。 1 つは「こんにちは、PHP の世界では OOP と言えます!」という文をブラウザに送信することです。もう 1 つの機能はデータベースからクエリを実行してブラウザに出力するためです。これは例としてのみ使用されており、実際のデータベース操作は含まれません。

最初のファイル、index.php から始めましょう。私のindex.phpファイルは次のようになります:

<?php
include_once ('config.php');
include_once ('class.Application.php');
$app = & new Application();
$app->run();
?>


たったの4行ですが、OOP形式で記述すれば十分です。
少し経験のある友人は、ここで使用されている Application オブジェクトが 1 つだけであることに気づくでしょう。したがって、このオブジェクトがどのようなものかを知りたいと思うはずです。引き続き class.Application.php ファイルの内部を見てみましょう。上記のコードから、少なくとも 2 つのメソッド、Application() と run() を含める必要があることがわかります。したがって、一般的には次のようになります:

<?php

class Application
{
function Application()
{

}

function run()
{

}
}

?>


アプリケーションがどのようなものであるかがわかったとしても、プリセット機能を完了できないように思えますか? そこで、このプログラムの実行方法も紹介したいと思います。私の構造では、すべてのページに、index.php とアクション パラメーターを介してアクセスします。たとえば、最初の関数は次のように、index.php?action=HelloPage にアクセスします。この関数には、index.php?action=DatabasePage を通じてアクセスします。この構造は誰でもよく知っているかもしれません。そのため、index.php ページは、渡されるアクション パラメーターが何であるかを認識する必要があります。つまり、Application オブジェクトは、アクション パラメーターが何であるかを認識する必要があります。したがって、アクションパラメータを取得するには、メソッド getAction() を Application に追加する必要があります。アクションと何をすべきかがわかったので、メソッド run() はそれを実行する方法もわかります。

同時に、(関数を完了する) 各ページをオブジェクトとして扱うこともできるので、少なくともあと 2 つのクラス
class HelloPage と
class DatabasePage
が必要になります。このため、どちらのオブジェクトも最終的にページをブラウザに送信するため、それらの共通部分は親クラスとして提示されます
class Page
以下は 3 つのクラス ファイル

class.Page の内容です。 . php
<?php

class Page
{
function Page()
{

}

function show()
{
//不能直接调用这个方法一定要在子类中去具体实现。
die('You can not use this funciton directly from Page class');
}
}
?>


showメソッドはすべてのページオブジェクトが持つメソッドのはずですが、実装が異なります。

class.HelloPage.php
<?php
require_once ("class.Page.php");

class HelloPage extends Page
{
function HelloPage()
{
parent::Page();
}

function show()
{
echo "Hello, I can say OOP in PHP world!";
}
}
?>;


class.DatabasePage.php
<?php
require_once ("class.Page.php");

class DatabasePage extends Page
{
function DatabasePage()
{
parent::Page();
}

function show()
{
//做一些数据库操作然后将结果显示出来。
}
}
?>;


同時に、このルールにも従う: action 値は、呼び出されるページ クラスの名前と一致します。たとえば、action=HelloPage の場合、プログラムは、このようなルールと上記のファイルを使用して、Application クラスを改善することができます。これに。

<?php

class Application
{
function Application()
{

}

function getAction()
{

}

function run()
{
$pageClass = $this->;getAction();
include_once ("class.".$pageClass.".php");
$page = & new $pageClass();
$page->;show();
}
}

?>


getAction() が空なのはなぜですか?とてもシンプルなので、自分でも簡単に書くことができます。

これを読んだ後、よく理解できなくても、心配しないでください。立ち止まってもう一度読んでください。

すべてを理解したら、次に進みます。まだタスクの半分が残っているので、データベース操作機能を完了できるようにアプリケーション クラスとページ クラスを改善する必要があります。
データベース操作を実行する前に、まず正しいデータベース接続を取得する必要があります。データベース接続を必要とする各ページ クラスにそのような作業を許可すると、非常に時間と労力がかかる作業になります。本来の設計意図は、DatabasePage などのデータベース操作を実行するページ クラスがジョブを完了してデータを取得することだけを行うことです。 私たちの設計を詳しく見てみると、データベース接続の確立作業をアプリケーションに任せるのが最も適切であることがわかります。そのため、新しいメンバー $db をアプリケーションに追加し、初期化中に確立されたデータベース接続をそれに割り当てます。 。

<?php
require_once ("class.Database.php");

class Application
{
var $db;//数据库对象

function Application()
{
$this->;db = & new Database(DB_HOST,DB_NAME,DB_LOGIN,DB_PASS);//$db 现在是一个数据库对象了
}

function getAction()
{
return $_GET['action']; //简单的实现 getAction;
}

funciton & getDatabase()
{
return $this->;db;
}

function run()
{
$pageClass = $this->;getAction();
include_once ("class.".$pageClass.".php");
$page = & new $pageClass($this); //这里是唯一做了手脚的地方,将这个Application对象传给页面对象。
$page->;show();
}
}

?>


この Database オブジェクトがどこから来たのか、どのように実装されているのかをあまり気にする必要はありません。データベース接続を含むオブジェクトであることだけを理解してください。 phplib、ADODB、または Pear ライブラリを使用したことがある場合は理解しやすいです。
このステートメント:
$this->;db = & new Database(DB_HOST,DB_NAME,DB_LOGIN,DB_PASS);
これはデータベース接続を確立するだけです。

至于DB_HOST,DB_NAME,DB_LOGIN,DB_PASS 这些都是常量我们在config.php中已经预先设定。

由于数据库操作页面 DatabasePage 需要进行数据库连接所以它也需要一个变量 $db 来保存数据库对象,所以我们需要把DatabasePage改进成这样:

class.DatabasePage.php

<?php
require_once ("class.Page.php");

class DatabasePage extends Page
{
var $db;

function DatabasePage(&$app)//将Application对象作为参数接受。
{
parent::Page();
$this->;db = $app->;getDatabase();//获得 Application 中的数据库对象。
}

function show()
{
$sql = 'SELECT * FROM sale_orders';//简单的一个 SQL 例子。
$results = $this->;db->;query($sql);//query 是 Database对象的一个公共的方法,通过它向数据库提交SQL查询。
...;//做一些操作把得到的结果显示出来。
}
}
?>


好了,一个半的功能算是完成了,PHP对于OOP支持得也很漂亮吧,结构清晰,维护方便,至于效率嘛,我可没看出来有什么损失,如果你有兴趣可以自己测试一下。用这样的框架可以轻松应对各种需求的变化:增加各种权限控制,分离数据库层,商业逻辑,和表象层,增加远程调用接口统统不成问题,只是这里实在写不完这么多的东西。真不知道谁还会有理由说PHP 中OOP 很烂呢?

另外,需要提醒大家的是传递对象和赋值的时候要使用 & 符号这样可以保证每次引用的是同一个对象。[/color][/size]

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