传统开发方法存在的问题:
1). 软件重用性差; 2). 软件可维护性差; 3). 无很好的扩展性
面向对象的三大特点:封装,继承,多态
1. 面向对象入门
类、属性、方法、构造函数、析构函数
<?php
class MyPc{
public $name="默认";
var $price;
function MyPc($name=""){//如果不赋默认值,调用该方法时如果不传参数,会提示警告
$this->name=$name;
}
//function __construct(){}//构造函数
function vod() {
return $this->name." 电脑";
}
function __destruct(){//析构函数
echo $this->name."<br>";//后进先出的原则
}
function test(){
return "磨灭了<br>";
}
}
echo MyPc::test();//类名直接访问方法,方法中不能有实例变量的引用
$pc1 = new MyPc("我的");
$pc2 = new MyPc("你的");
echo $pc1->vod()."<br>";
$pc1=null;//手动回收,自动调用__destruct()方法
echo $pc2->vod()."<br>";
$pc2=null;//手动回收,自动调用__destruct()方法
?>
2. 类的封装
封装是把一些相关的属性和行为隐藏起来,从而得到保护和安全
封装关键字
public 表示全局,类内部外部子类都可以访问;
protected表示受保护的,只有本类或子类或父类中可以访问;
private表示私有的,只有本类内部可以使用;
<?php
//类的封装和应用
class MyPc{
private $name;
private $age;
function __construct($name=""){
return $this->name=$name;
}
function __get($name){
return $this->name;
}
function __set($n,$v){
if($v>100){
$this->$n=$v;
}
}
private function power(){
return $this->name." 打开电源";
}
function ok(){
return $this->power().",开机成功";
}
}
$pc1=new MyPc("电脑");
$pc1->name=1000;//如果没有__set()方法,会报错
$pc1->age=200;
echo $pc1->name;//如果没有__get()方法,会报错
echo $pc1->age;
//__get()和__set()方法
/*
问题: __get方法和__set方法在类中只能定义一次,如果有多个私有属性,如何指定对应的get和set方法
__get和__set方法只是用来得到和设置属性的值,如果有多个,就在方法体里一一设置就行了
*/
?>
3. 类继承、抽象、接口、多态
<?php
//PHP中使用extends进行单一继承
class Root{
function root1(){
return "Root print<br>";
}
}
class Son extends Root{
function root1(){//覆盖父类的方法,如果想访问父类的方法,可用 类名::方法名()来访问
return "Root:".Root::root1()."in son's root";
}
function son1(){//此时可用$this变量来访问父类的方法
return $this->root1()."Son print<br>";
}
}
$p=new Son();
echo $p->son1();
echo $p->root1();
//抽象类
//php抽象类里必须有抽象方法,继承抽象类时必须实现所以的抽象方法
//java的抽象类里可以没有抽象方法
abstract class A{
abstract function fun1();
abstract function fun2();
function ok(){
}
}
class B extends A{
function fun1(){
echo "func1";
}
function fun2(){
echo "func2";
}
}
//接口
/*
* 所需的关键字interface implements
* 用法和java同
* 如果同时要继承和实现接口,先继承后接口,单继承多接口
* */
//多态
/*运算符 :instanceof
*
* */
class C{}
class D{}
$a=new C;//new C的时候居然可以不需要()
//echo $a;
if($a instanceof C){
echo '<br>C';
}
?>
4. 一些方法
__tostring()、__call()、__clone()、__autoload()
<?php
//__tostring()方法,类似java的toString 方法
//对象方法异常处理__call($funname,$arr_value)
/*
* 如果调用的方法不存在,会自动调用__call方法
* __call方法主要用来调试和吸收错误
* */
//克隆对象的应用
/*
* 方法名 __clone()
* 关键字 clone
*/
//自动载入对象的方法
/*
* 方法名 __autoload()
* 该方法是在类以外单独的方法
* */
class my{
public $name="我的类";
function __toString(){
return $this->name."tostring <br>";
}
function __call($methodname,$value){
echo "不存在的方法为:".$methodname."<br>";
echo "错误代码为:".print_r($value)."<br>";//参数值是以数组的形式传递,故用print_r打印
}
function __destruct(){
echo "清理一个对象<br>";
}
function __clone(){//使用clone关键字克隆时会自动调用该方法
$this->name="克隆的值";
}
}
$p=new my();
echo $p;
$p->demo("test");//demo方法并不存在,会调用__call方法,如果没有__call方法会报错
$b=clone $p;//克隆一个对象,执行完后,__destruct()会执行两次
echo $b->name."<br>";
function __autoload($class_name){
include($class_name.".php");
}
$al=new autoload();
$al->autoloadtest();
?>
5. 常用的关键字
<?php
//类中的常用关键字
/*
* final
*
* 用来定义类和方法的一个重要关键字,
* 当定义类的时候该类将不能被继承,当用来定义方法的时候该方法将不能被重载
*
* self
*
* 用来用类访问当前类中的内容的关键字,
* 类似与$this关键字,但$this是需要类实例化以后才可以使用,self 可以直接访问当前类中的内部成员
*
* 因为没有实例化类访问内部属性或者方法是没有意义的,所以self一般用来访问类中的:静态成员,常量,或者其他定义内容
* self :: 类内部成员(属性或者方法) <==>类名 :: 类内部成员(属性或者方法)
* 问题:self和this的区别
*
* static
* 用来定义类的静态属性或方法,可以在类未被实例化时使用
* 静态属性单独占用内存而不会因创建多个对象时而导致同样的方法或者属性重复占用。
*
* 静态方法内部禁止出现非静态内容(不能使用this关键字)
*
* 静态成员的访问:
* 类名称 : : 静态成员
* self : : 静态成员
*
* const
*
* 用来定义类中的常量,类似PHP外部定义常量的关键字define();
* Const只能修饰类当中的成员属性!
* 1、建议大写常量
* 2、常量不使用$符号
* 常量的访问:
* 类名称 : : 常量
* self : : 常量
* */
?>