ホームページ > バックエンド開発 > PHPチュートリアル > PHP5:OOP - 個別のビジネス ロジック層コードは必要ですか?

PHP5:OOP - 個別のビジネス ロジック層コードは必要ですか?

WBOY
リリース: 2016-06-13 13:05:17
オリジナル
914 人が閲覧しました

PHP5:OOP -- ビジネス ロジック層のコードを分離する必要がありますか?
個人的には、MVC 3 層モデルは、ビュー層の JAVA 3 層開発モデルのサブセットにすぎないと感じています。私は、日常の Web サイト開発プロセスで、以前は MVC ベースの PHP フレームワークを使用して開発していました。以前に JAVA ワークフローを使用する プロジェクト開発後、PHP プログラマーとして以前のプロジェクト開発モデルを使用できますか?

この週末、従業員情報マネージャーの小さなデモから実現可能性をテストするために、このパスに従いました。 PHP は非常に必要ですが、まったく使用できないこともあります。これは、コードが非常に再利用できるためですが、この種のコードは作成する過程で非常に面倒で、PHP ページがリロードされます。再度呼び出されるたびに作成され初期化されます。パフォーマンスは非常に低いです。
エンタープライズ アプリケーションには問題ないようですが、この場合、PHP 本来の利点である軽量開発が便利です...

私はあまりにも詳しくないので、この結論に達しました...以下はコードです: これらのコードは、JAVA WEB プロジェクトのディレクトリ構造に従って分割され、 JAVA 3層モデル 開発ツール Eclipse3.3

│  .project
│  index.php
│  webconf.php
│
├─WEB-INF
│  ├─lib
│  │  └─cn
│  │      └─iamsese
│  │          └─core
│  ├─config
│  │      dbconf.php 
│  │
│  └─classes
│      └─vb2005xu
│          └─sinlet
│              ├─service  -- 这里是逻辑层的代码
│              │  │  IPersonService.php -- 服务接口
│              │  │
│              │  ├─impl
│              │  │      PersonServiceImpl.php -- 服务实现
│              │  │
│              │  └─bo
│              │          Person.php -- 业务对象
│              │          PersonManager.php -- 
│              │          PersonRecord.php -- 这个由DAO层来实现
│              │
│              ├─ui
│              ├─exception
│              └─dao
│                      PersonRecordDaoImpl.php
│
├─META-INF
│      MANIFEST.MF
│
├─admin
├─.settings
│      org.eclipse.php.core.projectOptions.prefs
│
└─.cache
ログイン後にコピー



PHPにはJAVAのパッケージ機構がないため[ネームスペース機能はPHP6で導入されたようですが、私は PHP4 のみに精通しており、PHP5 は初めてです。ここでは、プロジェクトのファイルの読み込みメカニズムと、一般的に使用されるいくつかの設定パラメーターを定義する必要があります。これは、次のとおりです。コードを見てください:



Every プロジェクトの各プログラムにはエントリ ファイルがあり、Web アプリケーションにも同じことが言えます。ここでは、index.php ファイルも同様です。これを JAVA クラス ファイルの main メソッドと考えてください。コードは次のとおりです。
<?php
/**
 *文件名称: /myworkfolw/webconf.php
 *编码类型: UTF-8
 *开发时间: 2008 下午11:43:45
 *开发者:    许消寒 [iamses.cn]
 *版权所有者: 许消寒[iamses.cn]
 *
 *功能描述:
 *	应用的服务环境配置参数,因为模拟的是JAVA Web应用的目录格式,所以要在此文件中
 *进行必要的常量声明,从而固定系统的访问路径.
 * 
 *此文件名称不能改变的,最好作为设置成只读 
 */

/**
 * 这里滚翻一下语法,凡是系统定义的常量 一律以单词第一个字母大写
 * 多个单词使用下划线加单词首字母大写的格式来定义变量,
 * 不能使用-来作为变量分隔符号,后面要用到它
 *
 */

//返回当前文件所在的目录路径,取得的值后面不带/或者\符号
define("Web_Root",dirname(realpath(__FILE__))) ;

//定义系统库所在路径
define("Lib_Path", Web_Root . "/WEB-INF/lib/") ;

//定义用户库所在路径
define("Class_Path", Web_Root . "/WEB-INF/classes/") ;

//定义配置文件所在路径 -- 存放用户定义的配置文件所在地
define("Config_Path", Web_Root . "/WEB-INF/conf/") ;
echo Web_Root ; //测试使用


//定义常用的一些方法,比如文件,模块,配置文件的加载的一些方法

/**
 * 加载一个文件,实际上是对require_once的封装
 * 并加了做了错误处理功能,这里仅仅是一个简单的功能
 * 在系统核心中应该扩充这个函数
 *
 * @param String $file
 */
function LoadFile($file){
	require_once $file;
}

/**
 * 加载用户库所在路径下的文件
 *
 * @param String $file
 */
function LoadUserClassFile($file){
	$file = Class_Path . $file ;
	LoadFile($file);
}

/**
 * 加载系统库所在路径下的文件
 *
 * @param String $file
 */
function LoadLibFile($file){
	$file = Lib_Path . $file ;
	LoadFile($file);
}

?>
ログイン後にコピー



実際には、テスト ブロック コード内で実行したかったのです。ここで小さな IOC を実装します。IOC を実装するのに PHP を使用するのは非常に簡単です。ここではアイデアをテストしているだけなので、そのコードについては、以前に書いた記事を参照してください。
<?php
/**
 *文件名称: /myworkfolw/index.php
 *编码类型: UTF-8
 *开发时间: 2008 下午11:38:38
 *开发者:    许消寒 [iamses.cn]
 *版权所有者: 许消寒[iamses.cn]
 *
 *功能描述:
 *	加载常用的配置参数,作为应用的单一入口	 	
 * 
 */

//加载环境配置文件: webconf.php
require_once 'webconf.php';

LoadUserClassFile("vb2005xu/sinlet/service/IPersonService.php");



//#####################################################################################
//################以下代码纯属测试使用,正式开发时这个应该放到UI层的Action中封装使用###############

/**
 * 返回 组员信息管理服务接口的实现对象
 * 应该是由组件自动封装的,通过配置文件.在JAVA中这一般是使用IOC来封装的
 *
 * @return IPersonService
 */
function getPersonService(){
	LoadUserClassFile("vb2005xu/sinlet/service/impl/PersonServiceImpl.php");
	LoadUserClassFile("/vb2005xu/sinlet/dao/PersonRecordDaoImpl.php");
	
	$personService = new PersonServiceImpl(); //创建接口实现类的实例
	
	$personManager = new PersonManager();
	$personService->setManager($personManager);
	
	$personRecord = new PersonRecordDaoImpl();
	$personManager->setRecorder($personRecord);
	
	//这里因为传递的都是引用,而且使用的是PHP5代码,所以无需使用&来表示传递引用值
	
	return $personService ;	
}
$personService = getPersonService();
echo "<br/>" ;
$personService->addPerson("");
echo "<br/>" ;
$personService->delPerson("");
echo "<br/>" ;
$personService->viewPerson("");
echo "<br/>" ;
$personService->listPerson("");
echo "<br/>" ;
$personService->updatePerson("");



?>
ログイン後にコピー

最初に抽象インターフェイス ファイル LoadUserClassFile("vb2005xu/sinlet/service/IPersonalService.php");
この関数は webconf.php で定義されており、WEB-INF/classes/ の下にファイルをロードするために使用されます。ディレクトリ構造は次のとおりです。上記のように

基本的な準備作業が完了したので、具体的な内容を入力しましょう... (*^__^*) ふふふ...




このコード行はビジネス オブジェクト コードです。
<?php
/**
 *文件名称: /myworkfolw/WEB-INF/classes/vb2005xu/sinlet/service/IPersonService.php
 *编码类型: UTF-8
 *开发时间: 2008 上午12:46:09
 *开发者:    许消寒 [iamses.cn]
 *版权所有者: 许消寒[iamses.cn]
 *
 *功能描述:
 *	单表操作 -- 基本的员工信息管理服务接口
 */

/**
 * 接口关键字前面不包含任何 访问控制关键字
 *
 */

LoadUserClassFile("vb2005xu/sinlet/service/bo/Person.php");

interface IPersonService {
	/**
	 * 添加一个组员
	 *
	 * @param Person $person
	 */
	public function addPerson($person);
	
	/**
	 * 更新组成员信息
	 *
	 * @param Person $person
	 */
	public function updatePerson($person);
	
	/**
	 * 删除组员 -- 根据用户id数组
	 *
	 * @param array(int) $userIDs
	 */
	public function delPerson($userIDs);
	
	/**
	 * 查看组员信息 -- 根据指定用户ID
	 *
	 * @param int $userID
	 */
	public function viewPerson($userID);
	
	/**
	 * 根据查询条件列表对象来获取组员信息集合
	 *
	 * @param ListObject $listobject
	 */
	public function listPerson($listobject);
	
	
}
?>
ログイン後にコピー
LoadUserClassFile("vb2005xu/sinlet/service/bo/person.php");



personServiceImpl.php はサービスの実装クラス:
<?php
/**
 *文件名称: /myworkfolw/WEB-INF/classes/vb2005xu/sinlet/service/bo/Person.php
 *编码类型: UTF-8
 *开发时间: 2008 上午01:07:49
 *开发者:    许消寒 [iamses.cn]
 *版权所有者: 许消寒[iamses.cn]
 *
 *功能描述:
 *	组员信息对象 
 */

/**
 * 类成员都必须使用关键字public、protected 或 private 进行定义
 * 并且成员对象中 var 关键字不能再被使用,
 * class 关键字之前不能使用访问控制符
 *
 */
class Person {	
	
	/**
	 * 组员id,年龄和性别
	 *
	 * @var int
	 */
	public $userID , $userAge,$userGender;
	
	/**
	 * 组员姓名和生日
	 *
	 * @var String
	 */
	public $userName , $userBrithday ; 
	
	/**
	 * 组员介绍
	 *
	 * @var String
	 */
	public $userIntroduction ; 
	
	/**
	 * 属性访问控制器: get 方法 根据指定的属性名称返回 属性值
	 *
	 * @param String $property
	 * @return value
	 */
	public function get($property){
		return $this->$property ;
	}
	
	/**
	 * 属性访问控制器: set 方法 根据指定的属性名称和值 操作类属性
	 *
	 * @param String $property
	 * @param value $value
	 */
	public function set($property,$value){
		$this->$property = $value;
	}
	
}
?>
ログイン後にコピー



<?php
/**
 *文件名称: /myworkfolw/WEB-INF/classes/vb2005xu/sinlet/service/impl/PersonServiceImpl.php
 *编码类型: UTF-8
 *开发时间:2008-11-28 上午01:56:46
 *开发者:    许消寒 [iamses.cn]
 *版权所有者: 许消寒[iamses.cn]
 *
 *功能描述:
 *    组员信息管理服务层的实现 * 至此组员信息管理系统的 服务层模块 已经完工
 * 
 * 但是这个里面 还有一个接口PersonRecord 未被实现 *这个留待 dom 层来实现, 这样就分出了三层应用的模型 
 *
 */

LoadUserClassFile("vb2005xu/sinlet/service/IPersonService.php");
LoadUserClassFile("vb2005xu/sinlet/service/bo/PersonManager.php");

class PersonServiceImpl implements IPersonService {
	
	/**
	 * 	组员信息管理器对象
	 *
	 * @var PersonManager
	 */
	private $manager ; 
	
	/**
	 * 返回 组员信息管理器对象
	 *
	 * @return PersonManager
	 */
	public function getManager(){		
		return $this->manager ;
	}
	
	/**
	 * 设置 组员信息管理器对象
	 *
	 * @param PersonManager $manager
	 */
	public function setManager($manager) {
		$this->manager = $manager;
	}

	/**
	 * 添加一个组员
	 *
	 * @param Person $person
	 */
	public function addPerson($person){
		$this->getManager()->addPerson($person);
	}
	
	/**
	 * 更新组成员信息
	 *
	 * @param Person $person
	 */
	public function updatePerson($person){
		$this->getManager()->updatePerson($person);
	}
	
	/**
	 * 删除组员 -- 根据用户id数组
	 *
	 * @param array(int) $userIDs
	 */
	public function delPerson($userIDs){
		$this->getManager()->delPerson($userIDs);
	}
	
	/**
	 * 查看组员信息 -- 根据指定用户ID
	 *
	 * @param int $userID
	 */
	public function viewPerson($userID){
		$this->getManager()->viewPerson($userID);
	}
	/**
	 * 根据查询条件列表对象来获取组员信息集合
	 *
	 * @param ListObject $listobject
	 */
	public function listPerson($listobject){
		$this->getManager()->listPerson($listobject);
	}
	
}
?>
ログイン後にコピー
LoadUserClassFile("vb2005xu/sinlet/service/IPersonalService.php");
上記のインターフェイスを見てください
LoadUserClassFile( "vb2005xu/sinlet/service/bo/PersonManager.php");
これはレイヤーとして抽象化されており、オプションですが、拡張のために、以前働いていた JAVA 会社でもこれを質問しました。これが彼らの答えです...もしかしたら、これも私が JAVA を辞めた理由の小さな要因だったのかもしれません...





<?php
/**
 *文件名称: /myworkfolw/WEB-INF/classes/vb2005xu/sinlet/service/bo/PersonManager.php
 *编码类型: UTF-8
 *开发时间: 2008 上午01:30:45
 *开发者:    许消寒 [iamses.cn]
 *版权所有者: 许消寒[iamses.cn]
 *
 *功能描述:
 *	组员信息管理器
 */
LoadUserClassFile("vb2005xu/sinlet/service/bo/PersonRecord.php");
class PersonManager{
	/**
	 * 	组员信息管理数据记录器对象
	 *
	 * @var PersonRecord
	 */
	private $recorder ; 
	
	/**
	 * 返回 组员信息管理数据记录器对象
	 *
	 * @return PersonRecord
	 */
	public function getRecorder(){		
		return $this->recorder ;
	}
	
	/**
	 * 设置 组员信息管理数据记录器对象
	 *
	 * @param PersonRecord $recorder
	 */
	public function setRecorder($recorder) {
		$this->recorder = $recorder;
	}
	
	/**
	 * 添加一个组员
	 *
	 * @param Person $person
	 */
	public function addPerson($person){
		$this->getRecorder()->addPerson($person);
	}
	
	/**
	 * 更新组成员信息
	 *
	 * @param Person $person
	 */
	public function updatePerson($person){
		$this->getRecorder()->updatePerson($person);
	}
	
	/**
	 * 删除组员 -- 根据用户id数组
	 *
	 * @param array(int) $userIDs
	 */
	public function delPerson($userIDs){
		$this->getRecorder()->delPerson($userIDs);
	}
	
	/**
	 * 查看组员信息 -- 根据指定用户ID
	 *
	 * @param int $userID
	 */
	public function viewPerson($userID){
		$this->getRecorder()->viewPerson($userID);
	}
	/**
	 * 根据查询条件列表对象来获取组员信息集合
	 *
	 * @param ListObject $listobject
	 */
	public function listPerson($listobject){
		$this->getRecorder()->listPerson($listobject);
	}
	
}
?>
ログイン後にコピー
LoadUserClassFile("vb2005xu/ sinlet/service/bo/PersonRecord.php");
実装のために DAO 層に提供されるインターフェイスである従業員オブジェクトのレコード マネージャーをロードします





<?php
/**
 *文件名称: /myworkfolw/WEB-INF/classes/vb2005xu/sinlet/service/bo/PersonRecord.php
 *编码类型: UTF-8
 *开发时间: 2008 上午01:27:48
 *开发者:    许消寒 [iamses.cn]
 *版权所有者: 许消寒[iamses.cn]
 *
 *功能描述:
 *	组员信息管理数据记录器
 */

LoadUserClassFile("vb2005xu/sinlet/service/bo/Person.php");
interface PersonRecord {
	/**
	 * 添加一个组员
	 *
	 * @param Person $person
	 */
	public function addPerson($person);
	
	/**
	 * 更新组成员信息
	 *
	 * @param Person $person
	 */
	public function updatePerson($person);
	
	/**
	 * 删除组员 -- 根据用户id数组
	 *
	 * @param array(int) $userIDs
	 */
	public function delPerson($userIDs);
	
	/**
	 * 查看组员信息 -- 根据指定用户ID
	 *
	 * @param int $userID
	 */
	public function viewPerson($userID);
	
	/**
	 * 根据查询条件列表对象来获取组员信息集合
	 *
	 * @param ListObject $listobject
	 */
	public function listPerson($listobject);
}
?>
ログイン後にコピー
この時点で、ビジネス ロジック層のコードは基本的に完成しています。PersonRecord インターフェイスを実装する限り、アプリケーションは実装できます。 function
LoadUserClassFile("/vb2005xu/sinlet/dao/PersonRecordDaoImpl.php");
コードを見ると、ここには特定の DAO 層の実装はなく、一部のテスト コードのみです






<?php

/**
 *文件名称: /myworkfolw/WEB-INF/classes/vb2005xu/sinlet/dao/PersonRecordImpl.php
 *编码类型: UTF-8
 *开发时间:2008-11-28 上午02:04:33
 *开发者:    许消寒 [iamses.cn]
 *版权所有者: 许消寒[iamses.cn]
 *
 *功能描述:
 *	组员信息记录器的dao层 简单实现
 */
LoadUserClassFile("vb2005xu/sinlet/service/bo/PersonRecord.php");
class PersonRecordDaoImpl{
	
	/**
	 * 添加一个组员
	 *
	 * @param Person $person
	 */
	public function addPerson($person){
		echo "add suc";
	}
	
	/**
	 * 更新组成员信息
	 *
	 * @param Person $person
	 */
	public function updatePerson($person){
		echo "update suc";;
	}
	
	/**
	 * 删除组员 -- 根据用户id数组
	 *
	 * @param array(int) $userIDs
	 */
	public function delPerson($userIDs){
		echo "del suc";
	}
	
	/**
	 * 查看组员信息 -- 根据指定用户ID
	 *
	 * @param int $userID
	 */
	public function viewPerson($userID){
		echo "view suc";;
	}
	/**
	 * 根据查询条件列表对象来获取组员信息集合
	 *
	 * @param ListObject $listobject
	 */
	public function listPerson($listobject){
		echo "list suc";;
	}
	
}
?>
ログイン後にコピー
上記のコードはすべて PHP5.1 以降で正常に実行できます。

利点の要約: コーディングが容易になります。 実装が分離されて高速化されます。もちろん、これは 7 人以上のチームのことを指しますが、PHP プロジェクトの場合は、一般的には現実的ではなく、非常に面倒です。笑

これらのコードを読んでいただき、ありがとうございます。 ....

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート