<?php教程
/* PHP物件導向的程式設計
*
* PHP5
*
* 數組和對象:都屬於PHP的複合類型(一個變數可以儲存多個單元)
*
* 對象比數組更強大,不僅可以儲存多個資料,還可以將函數存在對象中
*
* 對象的三大特性:封裝、繼承、多態
*
* 物件導向編程(oop) //符合軟體工程中的 重用性 靈活性 擴充性
*
* 物件導向和面向過程之間的區別
*
* 最小的單位:函數 //面向過程
* 最小的單位:對象 //物件導向
*
* 什麼是對象
近來,新浪管理層開始套現,公開訊息披露,當年的MBO使得管理層意氣風發地成為新浪第一大股東,可到今天,他們已經成為了第二大股東。股權比例相距倒是不大:和第一大股東FMR9.24%的比例只有0.1%的差距。但新浪管理層手上有約定出售股權的協議,如果算上這部分未來可能會拋售的股權,管理層就只剩下5.74%了。新浪的確有可能再次成為一個“無主的公司”。
這就是新浪作為一家公司,未來的麻煩:盈利模型不清晰,無主的可能性又開始展現。
* 對象是一個實體
* 對象:
* 成員屬性==變數//定義對象的外觀和狀態
* 成員方法==函數//定義對象的功能
*
* 什麼是類
* 分類、類型、自訂類型
*
* 在類中定義這個類型的屬性和方法
*
* 類和對象之間的一個關係
*
* 聲明類-->執行個體化對象(建立對象)-->使用對象
*
*
* 最難得是如何設計出物件導向的程式,而不是物件導向的文法。
*
*/
?>
原來的成員:
var $name; //聲明人的姓名
var $sex; //聲明人的性別
var $age; //聲明人的年齡
function run(){…….}
改成封裝的形式:
private $name; //把人的姓名使用private關鍵字進行封裝
private $sex; //把人的性別使用private關鍵字進行封裝
private $age; //把人的年齡使用private關鍵字進行封裝
private function run(){……} //把人的走路方法使用private關鍵字進行封裝
注意:只要是成員屬性前面有其它的關鍵字就要去掉原有的關鍵字“var”。
通過private就可以把人的成員(成員屬性和成員方法)封裝上了。封裝上的成員就不能被類外面直接存取了,只有對象內部自己可以訪問;下面的代碼會產生錯誤:
class Person
{
//下面是人的成員屬性
private $name; //人的名子,被private封裝上了
private $sex; //人的性別, 被private封裝上了
private $age; //人的年齡, 被private封裝上了
//這個人可以說話的方法
function say()
{
echo "我的名子叫:".$this->name." 性別:".$this->sex." 我的年齡是:".$this->age."<br>";
}
//這個人可以走路的方法, 被private封裝上了
private function run()
{
echo "這個人在走路";
}
}
//執行個體化一個人的執行個體對象
$p1=new Person();
//試圖去給私人的屬性賦值, 結果會發生錯誤
$p1->name="張三";
$p1->sex="男";
$p1->age=20;
//試圖去列印私人的屬性, 結果會發生錯誤
echo $p1->name.”<br>”;
echo $p1->sex.”<br>”;
echo $p1->age.”<br>”
//試圖去列印私人的成員方法, 結果會發生錯誤
$p1->run();
輸出結果為:
Fatal error: Cannot access private property Person::$name
Fatal error: Cannot access private property Person::$sex
Fatal error: Cannot access private property Person::$age
Fatal error: Cannot access private property Person::$name
Fatal error: Call to private method Person::run() from context ''
從上面的執行個體可以看到, 私人的成員是不能被外部存取的, 因為私人成員只能在本對象內部自己訪問,比如,$p1這個對象自己想把他的私人屬性說出去,在say()這個方法裡面訪問了私人屬性,這樣是可以。(沒有加任何存取控制,預設的是public的,任何地方都可以訪問)
//這個人可以說話的方法, 說出自己的私人屬性,在這裡也可以訪問私人方法
function say()
{
echo "我的名子叫:".$this->name." 性別:".$this->sex." 我的年齡是:".$this->age."<br>";
//在這裡也可以訪問私人方法
//$this->run();
}
因為成員方法say()是公有的, 所以我們在類的外部調用say()方法是可以的,改變上面的代碼;
class Person
{
//下面是人的成員屬性
private $name; //人的名子,被private封裝上了
private $sex; //人的性別, 被private封裝上了
private $age; //人的年齡, 被private封裝上了
//定義一個構造方法參數為私人的屬性姓名$name、性別$sex和年齡$age進行賦值
function __construct($name, $sex, $age)
{
//通過構造方法傳進來的$name給私人成員屬性$this->name賦初使值
$this->name=$name;
//通過構造方法傳進來的$sex給私人成員屬性$this->sex賦初使值
$this->sex=$sex;
//通過構造方法傳進來的$age給私人成員屬性$this->age賦初使值
$this->age=$age;
}
//這個人可以說話的方法, 說出自己的私人屬性,在這裡也可以訪問私人方法
function say()
{
echo "我的名子叫:".$this->name." 性別:".$this->sex." 我的年齡是:".$this->age."<br>";
}
}
//通過構造方法建立3個對象$p1、p2、$p3,分別傳入三個不同的實參為姓名、性別和年齡
$p1=new Person(“張三”,”男”, 20);
$p2=new Person(“李四”,”女”, 30);
$p3=new Person(“王五”,”男”, 40);
//下面訪問$p1對象中的說話方法
$p1->say();
//下面訪問$p2對象中的說話方法
$p2->say();
//下面訪問$p3對象中的說話方法
$p3->say();
輸出結果為:
我的名子叫:張三 性別:男 我的年齡是:20
我的名子叫:李四 性別:女 我的年齡是:30
我的名子叫:王五 性別:男 我的年齡是:40
<?php
class user{
private $shell ; //使用者身份 這裡是包含名字 和 許可權的二維數組
private $ob; //模組對象 例如 財務模組 caiwu
function __construct($shell){
$this->shell = $shell;
}
function mannger($ob){
$this->ob = new $ob($this->shell);
}
function qianguize(){
$this->shell[name] != '小蜜'? die('!') :'';
$this->ob = new mklove($this->shell);
}
}
class caiwu{
function __construct($shell){
if(!in_array('caiwu',$shell[quanxian])) {
echo($shell[name]."你不可以管理財務哦~!<br/>");
}else{
echo $shell[name]."你可以管理財務<br/>";
}
}
}
class mklove{
function __construct (&$shell){
if(!in_array('mklove',$shell[quanxian])) die('你不可以');
echo "www.111cn.net";
$shell[quanxian][]='caiwu';
}
}
/*
其中user 是使用者類
caiwu !
*/
$shell = array(name=> 'fs', quanxian=>array('caiwu','xingzheng','cailiao','mklove'));
$shell0 = array(name=> 'f', quanxian=>array('cailiao','mklove')) ;
$jingli = new user($shell) ;
$xiaomi = new user($shell0) ;
echo "<h4>他們分別試著去管理財務</h4><br/>";
$jingli->mannger('caiwu') ;
$xiaomi->mannger('caiwu') ;
echo "<h4>潛規則後的結果</h4><br/>";
$xiaomi->qianguize();
$xiaomi->mannger('caiwu') ;
?>