ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルの Collection クラスの設計の簡単な分析

PHP_PHP チュートリアルの Collection クラスの設計の簡単な分析

WBOY
WBOYオリジナル
2016-07-21 15:04:021147ブラウズ

私は長年 .net を使って開発をしてきましたが、最近 php に触れるようになり、php もとても楽しいことに気づきました。ただし、そこには Collection クラスはなく、配列だけがあり、配列は非常に強力であることがわかりました。ここでは、配列を使用してコレクションにラップします。 コードは次のとおりです。

コードをコピーします。 コードは次のとおりです。
class Collection{
private $_members=array(); public function additem($ obj、$ key = null)
"key" $ key "既に使用!"); function removeitem($ key) );
Return $ this->members[$key]
パブリック関数キー()
{
return array_keys($ this->_members)
}

public function Legth()
{
Return (isset) ($this ->_members[$key]));
}
}


次に、このコレクションが使いやすいかどうかをテストしてみましょう。
最初にコレクション要素クラスを作成します コース:



コードをコピーします

コードは次のとおりです:

クラス コース
{
プライベート $_id;
プライベート $_courseCode;
プライベート $_name;

public function __construct($id,$courseCode,$name)
{
$this->_id=$id;
$this->_courseCode=$courseCode;
$this->_name=$name;
}

public function getName()
{
return $this->_name;
}

public function getID()
{
return $this->_id;
}

public function getCourseCode()
{
return $this->_courseCode;
}

public function __toString()
{
return $this->_name;
}
}

测试代码如下:
$courses=new Collection();
$courses->addItem(new Course(1, "001", "语文"),1);
$courses->addItem(new Course(2, "002", "数学"),2);
$obj=$courses->getItem(1);
$obj を印刷します。
私たちは、このセットの種類が私たちの平日公開の要求を満たすことができると考えています。
私がいる可能性があります。非常に多くのコースがあり、ただし、コースを受講する前にコースをロードしないことを希望します。つまり、生徒を模範するときのコースの数は 0 であり、コースが必要なときに対応するデータをデータベースから取得する必要があります。コレクションを取得する必要があります。
修正後のコレクションコードは以下の通り:
修正コードは以下の通り:

クラス コレクション {
private $_members = array();    //コレクションメンバー
private $_onload;               //コールバック関数のホルダー
private $_isLoaded = false;     //コールバックかどうかを示すフラグ
// 呼び出されているかどうかを示すフラグ
public function addItem($obj, $key = null) {
$this->gt;_checkCallback();      //_checkCallback は少し後で定義されます

if($key) {
if(isset($this->_members[$key])) {
throw new KeyInUseException("Key "$key" はすでに使用されています!" );
} else {
$this->_members[$key] = $obj;
}
} else {
$this->_members[] = $obj;
}
}
public function RemoveItem($ key) {
$this->_checkCallback();

if(isset($this->_members[$key])) {
unset($this->_members[$key]);
} else {
throw new KeyInvalidException("無効なキー "$key"!");
}
}

public function getItem($key) {
$this->_checkCallback();

if(isset($this- >_members[$key])) {
return $this->_members[$key];
} else {
throw new KeyInvalidException("無効なキー "$key"!");
}
}
public function key() {
$this->_checkCallback();
return array_keys($this->_members);
}
public function length() {
$this->_checkCallback();
return sizeof($ this->_members);
}
public function names($key) {
$this->_checkCallback();
return (isset($this->_members[$key]));
}
/ **
* このメソッドを使用して、コレクションにアクセスする前に
* 呼び出される関数を定義します。 
* 関数はコレクションを
* 唯一のパラメータとして受け取る必要があります。
  */
public function setLoadCallback($functionName, $objOrClass = null) {
if($objOrClass) {
$callback = array($objOrClass, $functionName);
} else {
$callback = $ functionName;
}

// 関数/メソッドが有効であることを確認します
if(!is_callable($callback, false, $callableName)) {
throw new Exception("$callableName is not callable " .
「onload のパラメータとして」);
return false;
}

$this->_onload = $callback;
}

/**
* コールバックが定義されているかどうかを確認し、定義されている場合は、
* すでに呼び出されているかどうかを確認します。  そうでない場合は、
* コールバック関数を呼び出します。
  */
_checkCallback () {
if( isset($this->_onload) && !$this->_isLoaded) {
$this->_isLoaded = true;
call_user_func($this->_onload, $this);
}
}
}

必要な学生次のように:
复制代代码如下:

class CourseCollection extends Collection {
public function addItem(Course $obj,$key=null) {
parent::addItem($obj,$key);
}
}
クラスの生徒{
プライベート $_id;
プライベート $_name;
パブリック $コース;

public function __construct($id,$name)
{
$this->_id=$id;
$this->_name=$name;
$this->course=new CourseCollection();
$this->course->setLoadCallback('loadCourses',$this);
}

public function getName()
{
return $this->_name;
}

public function getID()
{
return $this->_id;
}

public function __toString()
{
return $this->_name;
}
public functionloadCourses(Collection $col)
{
$col->addItem(new Course(1, "001", "语文"),1);
$col->addItem(new Course(2, "002", "数学"),2);
}
}

调用代码如下:
$student=new Student(1, "majiang");
print $student->getName();
print $student->course->getItem(1) );

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327791.html技術記事 .net の公開は何年も経ち、最近 php にアクセスし、php も公開しました。公開されていません。ここではコレクション クラスが存在せず、数グループのみがあり、数グループが存在します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。