<?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') ;
?>