PHP オブジェクト指向学習パート 2: 高度なオブジェクト指向機能の深い理解
静的メソッドは、クラスに作用する関数です。これらのプロパティはオブジェクトに属しているため、このクラスの通常のプロパティにはアクセスできませんが、静的プロパティにはアクセスできます。
静的プロパティが変更されると、このクラスのすべてのインスタンスが新しい値にアクセスできます。
例:
print staticExample::$aNum; StaticExample::sayHello();
①: オブジェクト内で静的メソッドを呼び出すことはできません
②: 疑似変数 $this
は静的メソッドでは使用できません<?php /** * 静态方法和属性:通过类而不是对象来访问数据和功能 * =============注解 * 只有使用parent关键字调用方法时,才能对一个非静态方法进行静态形式调用(一个子类可以使用parent关键字访问父类,self关键字从当前类中访问静态方法或属性) */ /** * 构建shopProduct类的一个静态方法来自动实例化shopProduct对象(在上节的shopProduct类基础上增加) * @return object shopProduct对象 */ class shopProduct{ private $id=0; //上节类中的内容 //... public function setID($id){ $this->id=$id; } public static function getInstance($id, PDO $pdo){ $stmt=$pdo->prepare("select * from products where id=?"); $result=$stmt->execute(array($id)); $row=$stmt->fetch(); //实例化CD类 $product=new CDProudct($row['title'], $row['firstname'], $row['mainname'], $row['price'], $row['playlength']); $product->setId($row['id']); $product->setDiscount($row['dusciybt']); return $product; } } /* * 这样的方法有点像 工厂,可以接受原始数据或配置 据此产生对象 */ $dsn='sqlite://home/db/bob/projects/products.db'; $pdo=new PDO($dsn, null, null); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $obj=shopProduct::getInstance(1, $pdo);
抽象クラスは直接インスタンス化できません。サブクラスに必要なメソッドを定義 (または部分的に実装) するだけで、サブクラスは抽象メソッドを実装することで抽象クラスを具体化できます。
抽象クラスには少なくとも 1 つの抽象メソッドが含まれています
abstract class shopProductWriter{ protected $products=array(); abstract public function write(); }
<?php /** * 抽象类实例 * @author lxm */ abstract class shopProductWriter{ protected $products=array(); public function addProduct(shopProduct $shopProduct){ $this->products[]=$shopProduct; } abstract public function write(); } /** * 输出XML */ class xmlProductWriter extends shopProductWriter{ public function write(){ $str='<?xml version="1.0" encoding="UTF-8"?>'."\n"; $str.="<products>\n"; foreach ($this->products as $shopProduct){ $str.="\t<product title=\"".$shopProduct->getTitle()."\">\n"; //... } $str.="</products>\n"; } }
抽象クラスは具体的な実装の標準を提供しますが、インターフェイスは純粋なテンプレートです。インターフェイスは関数を定義することのみが可能であり、実装コンテンツは含まれません
インターフェイスにはプロパティとメソッドの宣言を含めることができますが、メソッドは空です
例:
interface Chargeable{ public function getPrice(); }
class shopProduct implements Chargeable{ //... public function getPrice(){ return ;//... } }
PHP には、未定義のディストリビューションおよび属性に送信されたメッセージをインターセプトできる組み込みインターセプター インターセプター メソッドが用意されています。
未定義のプロパティにアクセスすると __get($property) が呼び出されます
未定義のプロパティに値を割り当てるときに__set($property,$value) が呼び出されます
未定義のプロパティに対して isset() が呼び出された場合、__isset($property) が呼び出されます
未定義のプロパティに対して unset() が呼び出された場合、__unset($property) が呼び出されます
未定義のメソッドを呼び出すときに__call($method,$arg_array) が呼び出されます
<?php /** * 使用拦截器 访问未定义属性时,__get()被调用 * 如果不存在什么也不做,用户试图访问的属性被解析为NULL */ class Person{ function __get($property){ $method="get".$property; if(!method_exists($this, $method)){ return $this->$method(); } } function getName(){ return "Bob"; } function getAge(){ return 24; } } $p= new Person(); print $p->name;
オブジェクトがガベージ コレクターによって収集される前 (つまり、オブジェクトがメモリから削除される前) に自動的に呼び出されます。
<?php /** * 需要把自身信息写入数据库,用析构方法在对象实例被删除时确保实例把自己保存到数据库中 */ class Person{ private $name; private $age; private $id; function __construct($name,$age){ $this->name=$name; $this->age=$age; } function setID($id){ $this->id=$id; } function __destruct(){ if(!empty($this->id)){ //保存Person数据 print "saving person\n"; } } } $person=new Person("bob", 24); $person->setID(111); unset($person); //输出 //保存Person