検索
ホームページバックエンド開発PHPチュートリアルPHP フレームワークを自分で書く方法

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 までご連絡ください。
PHPの現在のステータス:Web開発動向を見てくださいPHPの現在のステータス:Web開発動向を見てくださいApr 13, 2025 am 12:20 AM

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHP対その他の言語:比較PHP対その他の言語:比較Apr 13, 2025 am 12:19 AM

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHP対Python:コア機能と機能PHP対Python:コア機能と機能Apr 13, 2025 am 12:16 AM

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHP:Web開発の重要な言語PHP:Web開発の重要な言語Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHP:多くのウェブサイトの基礎PHP:多くのウェブサイトの基礎Apr 13, 2025 am 12:07 AM

PHPが多くのWebサイトよりも優先テクノロジースタックである理由には、その使いやすさ、強力なコミュニティサポート、広範な使用が含まれます。 1)初心者に適した学習と使用が簡単です。 2)巨大な開発者コミュニティと豊富なリソースを持っています。 3)WordPress、Drupal、その他のプラットフォームで広く使用されています。 4)Webサーバーとしっかりと統合して、開発の展開を簡素化します。

誇大広告を超えて:今日のPHPの役割の評価誇大広告を超えて:今日のPHPの役割の評価Apr 12, 2025 am 12:17 AM

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPの弱い参照は何ですか、そしていつ有用ですか?PHPの弱い参照は何ですか、そしていつ有用ですか?Apr 12, 2025 am 12:13 AM

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

PHPで__invoke Magicメソッドを説明してください。PHPで__invoke Magicメソッドを説明してください。Apr 12, 2025 am 12:07 AM

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。

See all articles

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

メモ帳++7.3.1

メモ帳++7.3.1

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

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター