PHP中单例模式跟工厂模式学习总结
PHP中单例模式和工厂模式学习总结
<?php ////////////////////////////////////////////// //单例模式 /** * 数据库连接职责的集中控制 * 声明一个单例类 */ class Database { private $_db; //声明一个私有的实例变量(构造对象时这个变量的值会被填充) static $_instance //声明一个静态变量(保存类中仅有的一个实例) //声明私有构造方法为了防止外部代码使用new操作符来创建对象 private function _construct(){ $this->_db = pg_connect('dbname = example_db'); } //声明私有_clone方法为了消除php语言中可以复制对象从而破坏单一职责的一个漏洞 private _clone(){}; /** * 声明getInstance()静态方法(单例模式实际构造);这个方法会检测静态实例变量是否已保存这个类的一个实例。 * 假如它没有包含自身的一个实例,那么类会初始化并且保存到$_instance变量中. * 下次访问这段代码时,$_instance 变量会保存类的一个实例,并且这个实例不会再次初始化。最后,这个方法返回实例的引用 */ public static function getInstance(){ if( !(self::$_instance instanceof self) ){ self::$_instance = new self(); } return self::$_instance; } public function query($sql){ return pg_query($this->_db, $sql);//使用$this->_db执行一个查询 } } /** * 对单例类的使用 */ $db = Database::getInstance(); $db->query('select * from example_table'); /** * 使用不能被实例化的纯静态类 */ class SomeClass { //防止类被当作实例使用 private function _construct(){} public static function SomeMethod(){ //执行一些操作 } } /////////////////////////////////////////////////////// //工厂模式:包含了一个专门用来创建其他对象的方法的类。 /** * 创建一个基本的工厂类 */ class MyObject { //对象将从工厂返回 } class MyFactory { public static function factory(){ //返回对象一个新实例 return new MyObject(); } } //调用方法 $instance = MyFactory::factory();////////////////////////////////////////// //图片对象工厂 /** * 使用工厂类解析图片文件 */ interface IImage { function getHeight(); function getWidth(); function getData(); } class Iamge_PNG implements IImage { private $_width, $_height, $_data; public function _construct($file){ $this->_file = $_file; $this->_parse(); } private function _parse(){ //完成格式化解析工作 //并填充$_width, $_height, $_data } public function getWidth(){ return $this->$_width; } public function getHeight(){ return $this->$_height; } public function getData(){ return $this->$_data; } } class Iamge_JPEG implements IImage { private $_width, $_height, $_data; public function _construct($file){ $this->_file = $_file; $this->_parse(); } private function _parse(){ //完成格式化解析工作 //并填充$_width, $_height, $_data } public function getWidth(){ return $this->$_width; } public function getHeight(){ return $this->$_height; } public function getData(){ return $this->$_data; } } class ImageFactory { public static function factory($file){ $pathParts = pathInfo($file); switch (strtolower($pathParts['extension'])) { case 'jpg' : $ret = new Image_JPEG($file); break; case 'png' : $ret = new Image_PNG($file); break; case 'gif' : $ret = new Image_GIF($file); break; default; // PROBLEM } if($ret instanceof IImage){ return $ret; }else{ //problem } } } // $image = ImageFactory::factory('/path/to/my.jpg'); //$image现在是Image_JPEG类的一个实例 echo $image->getWidth(); /** * 可移植的数据库 × 使用工厂类解决数据库可移植问题。 */ interface IDatabaseBindings { public function userExists($email); } class PGSQL implements IDatabaseBindings { protected $_connection; public function _construct() { $this->$_connection = pg_connect('dbname = example_db'); } public function userExists($email) { $emailEscaped = pg_escape_string($email); $query = 'select 1 from users where email = "'.$emailEscaped.'"'; if ($result = pg_query($query, $this->$_connection)) { return (pg_num_row($result > 0)) ? true : false; }else{ return false; } } } class MYSQL implements IDatabaseBindings() { protected $_connection; public function _construct() { $this->$connection = mysql_connect('localhost'); mysql_select_db('example_db', $this->$_connection ); } public function userExists($email) { $emailEscaped = mysql_real_escape_string($email); $query = 'select 1 from users where email = "'. $emailEscaped .'"'; if ($result = mysql_query($query, $this->$_connection)) { return (mysql_num_rows($result) > 0 ) ? true : false; }else{ return false; } } } class DatabaseFactory { public static function factory() { $type = loadtypefromconfigfile(); switch ($type){ case 'PGSQL': return new PGSQL(); break; case 'MYSQL': return new MYSQL(); break; } } } //用法 $db = DatabaseFactory::factory(); $db->userExists([email protected]');?>

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









多くのユーザーはスマートウォッチを選ぶときにファーウェイブランドを選択しますが、その中でもファーウェイ GT3pro と GT4 は非常に人気のある選択肢であり、多くのユーザーはファーウェイ GT3pro と GT4 の違いに興味を持っています。 Huawei GT3pro と GT4 の違いは何ですか? 1. 外観 GT4: 46mm と 41mm、材質はガラスミラー + ステンレススチールボディ + 高解像度ファイバーバックシェルです。 GT3pro: 46.6mm および 42.9mm、材質はサファイアガラス + チタンボディ/セラミックボディ + セラミックバックシェルです。 2. 健全な GT4: 最新の Huawei Truseen5.5+ アルゴリズムを使用すると、結果はより正確になります。 GT3pro: ECG 心電図と血管と安全性を追加

C 言語における return の使い方は、 1. 戻り値の型が void の関数については、return 文を使用して関数の実行を早期に終了することができます; 2. 戻り値の型が void ではない関数については、 return ステートメントは、関数の実行を終了するためのものです。結果は呼び出し元に返されます。 3. 関数の実行を早期に終了します。関数内で return ステートメントを使用して、関数の実行を早期に終了することもできます。関数が値を返さない場合。

ファンクションとは、関数を意味します。これは、特定の関数を備えた再利用可能なコード ブロックです。プログラムの基本コンポーネントの 1 つです。入力パラメータを受け取り、特定の操作を実行し、結果を返すことができます。その目的は、再利用可能なコード ブロックをカプセル化することです。コードの再利用性と保守性を向上させるコード。

ソースコード: publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}}#出力 上記のコードの出力は、単純に次のように結論付けることができます:finally の前に return が実行されます。バイトコード レベルで何が起こるかを見てみましょう。以下は、case1 メソッドのバイトコードの一部をインターセプトし、ソース コードを比較して、各命令の意味に注釈を付けます。

Windows 11 で Snipping Tool が機能しない理由 問題の根本原因を理解すると、適切な解決策を見つけるのに役立ちます。 Snipping Tool が正しく動作しない主な理由は次のとおりです。 フォーカス アシスタントがオンになっている: これにより、Snipping Tool が開かなくなります。破損したアプリケーション: 起動時にスニッピング ツールがクラッシュする場合は、破損している可能性があります。古いグラフィック ドライバー: 互換性のないドライバーは、スニッピング ツールに干渉する可能性があります。他のアプリケーションからの干渉: 実行中の他のアプリケーションが Snipping Tool と競合する可能性があります。証明書の有効期限が切れています: アップグレード プロセス中のエラーにより、この問題が発生する可能性があります。これらの簡単な解決策は、ほとんどのユーザーに適しており、特別な技術知識は必要ありません。 1. Windows および Microsoft Store アプリを更新する

毎年、Apple が iOS と macOS の新しいメジャー バージョンをリリースする前に、ユーザーは数か月前にベータ版をダウンロードして最初に体験することができます。同ソフトウェアは一般ユーザーと開発者の両方が使用するため、Appleは開発者向けベータ版のパブリックベータ版である開発者版とパブリック版を両方向けに開始した。 iOS の開発者バージョンとパブリック バージョンの違いは何ですか?文字通りに言うと、開発者バージョンは開発者テスト バージョンであり、パブリック バージョンは公開テスト バージョンです。開発者バージョンとパブリック バージョンは、異なるユーザーを対象としています。開発者バージョンは、Apple が開発者によるテストのために使用します。ダウンロードしてアップグレードするには、Apple 開発者アカウントが必要です。

パート 1: 最初のトラブルシューティング手順 Apple のシステムステータスを確認する: 複雑な解決策を掘り下げる前に、基本から始めましょう。問題はデバイスにあるのではなく、Apple のサーバーがダウンしている可能性があります。 Apple のシステム ステータス ページにアクセスして、AppStore が適切に動作しているかどうかを確認してください。問題があれば、Apple が修正してくれるのを待つしかありません。インターネット接続を確認します。「AppStore に接続できません」問題は接続不良が原因である場合があるため、安定したインターネット接続があることを確認してください。 Wi-Fi とモバイル データを切り替えるか、ネットワーク設定をリセットしてみてください ([一般] > [リセット] > [ネットワーク設定のリセット] > [設定])。 iOS バージョンを更新します。

この記事では、Python の enumerate() 関数と「enumerate()」関数の目的について学びます。 enumerate() 関数とは何ですか? Python の enumerate() 関数は、データ コレクションをパラメータとして受け取り、列挙オブジェクトを返します。列挙オブジェクトはキーと値のペアとして返されます。キーは各項目に対応するインデックス、値は項目です。構文 enumerate(iterable,start) パラメータ iterable - 渡されたデータ コレクションは、iterablestart と呼ばれる列挙オブジェクトとして返すことができます。 - 名前が示すように、列挙オブジェクトの開始インデックスは start によって定義されます。無視したら
