jackyrar 发表于 2017-4-2 07:17:26

php学习笔记(七)对象操作相关

/**
* 1.内存分为
*      (1).初始化静态段
*         只占一份的static
*      (2).栈内存
*         空间小,访问速度快,长度不变的数据类型放在栈内存中
*      (3).堆内存
*         空间大,访问速度慢,大的数据类型或者是空间不定长的类型
*      (4).代码段
*         语言的结构
*   php也是自动回收
*
* 2.php对象的访问
*      $对象名称->成员属性:$p->name="sid";
*      $对象名称->成员方法:$->say();
*      $this->name;
*
* 3.以__开头的方法为php内部定义的方法
*      php也有构造方法
*      只允许有一个__construct
*      析构函数:消失前自动调用__destruct(栈内存,后进先出)
*      java没有析构函数;析构函数是用来释放对象的引用的
*
* 4.封装性(魔术方法)
*      private$name;
*      privatefunction fun(){}
*      相对于读取和赋值频繁可使用set和get
*      __set()__get($proName)
*      判断属性是否存在默认的无法判断私有的属性;所以需要定义__isset
*   __isset()
*      清除成员属性或者变量
*   __unset()
*
* 5.继承(单继承)
*      extends
*      私有的方法无法继承
*      私有的属性一样不可以继承;
*      但是如果方法或者构造函数中有属性的声明
*         相当于在构造方法中新声明了属性;主要原因是php是弱类型语言
*
* 6.php不可以进行函数重载
*      但是可以覆盖父类的方法;只有跟父类方法一样名字即可
*      parent::say();相当于java的super关键字(也可以应用在构造方法当中)
*
* 7.访问类型(子类的方法类型不能低于父类的权限)
*      (1).private
*      (2).protected受保护的成员,子类可以使用
*      (3).public
*
* 8.常用关键字
*      (1).final:
*         只能用来定义类和方法
*         使用final定义的类不能被继承
*         使用final定义的方法不能被覆盖
*         (php常量是用define)
*      (2).static:第一次使用创建
*         静态的属性和方法定义;共享;
*         访问方法:Person::$country(方法和属性也可以用对象来访问)
*         赋值方式:Person::$country="USA";
*      this代表本对象;self代表本类
*         self::$country
*         static声明的方法里面不能使用非静态的成员。比如$this不能用
*      (3).const:常量无法赋值
*         define声明常量,但是不能声明成员属性
*         const是一个在类里面定义成员属性为常量的关键字。(#define是c语言的)
*         访问方式:Person::COUNTRY;(不加$符号)
*         可以使用self进行访问
*
* 9.四个魔术方法
*      (1)__toString
*         将对象进行默认的字符串输出
*      (2)__clone
*         复制对象,让内存中存在两份地址(克隆时调用的方法)
*         p3=clone$p1;
*         __clone(){$this->name="副本"}
*         这里的this表示的是副本的对象引用
*         二$that表示原来的副本
*      (3)__call
*         调用不存在的方法时提示的消息;使程序不崩溃
*         __call($funName,$argus){"调用的".$funName."不存在,参数¥argus"}
*      (4)__autoload
*         不是写在对象内部的,而是在对象外部使用的方法
*         1.指定加载类
*             include"Person_class.php";
*             $p1= new Person();
*         2.页面自动加载
*             function__autoload($className){
*                include$className."_class.php";
*             }
*
* 10.对象的串行化
*      全部序列化
*         两个过程:1.串行化(对象转成二进制字符串)和2.反串行化
*         1.serialize
*             (1).对象在网络中传输的时候
*             (2).将对象写入文件或者写入数据库时
*                $str= serialize($p1);
*                $file= fopen("tmp.txt","w");
*                fwrite($file,$str);
*                fclose($file);
*         2.unserialize
*                include"person.php";
*                $file= fopen("tmp.txt","r");
*                $str= fwrite($file,filesize("tmp.txt"));
*                fclose($file);
*                $p= unserialize($str);
*                $p->say();
*      部分序列化
*         1.__sleep():
*             在对象序列化之前自动调用。
*             $arr= array("name","sex");
*             return$arr;
*             这样只序列化,数组中的对象属性
*         2.__wakeup():
*             在对象反序列化的时候自动调用。
*             类似clone的副本操作
*             可以对属性进行初始化;比如年龄在过几年之后反序列化之后需要加上几年。
*             $this->age=45+3;
*
* 11.抽象类与接口(抽象类不能实例化对象;子类可以)
*抽象方法:abstract修饰的没有方法体的方法;直接在方法名后面加上;
*抽象类:至少有一个方法是抽象的;并且类必须使用abstract修饰
*接口:所有方法都是抽象的;并且只允许有常量const
*      
* 12.多态(php本身就是弱类型,所以在调用时只是一个引用,所以多态并不明显)
*      引用父类的方法,执行子类的实现方法。
*   
*/

/**
* 类的定义
* Enter description here...
* @author admin
*
*/
classPhone{
var$manufacruers;
var$color;
functionsendMessage($person,$message){
$person->phone->reviceMessage($message);
}
functionreviceMessage($message){
echo"接收的信息$message <br>";
}
functioncall(){
echo"call sb <br>";
}
functionanswerCall(){
echo"answer <br>";
}
}
classPerson{
var$name;
var$phone;
private$age = 12;
//   private Phone $phone;
/**
* 构造方法php5
* 设置默认初始值为空
* 这样就可以屏蔽掉因为构造函数无参数时候的警告信息了
* @param $name
* @param $phone
*/
function__construct($name="",$phone=""){
$this->name=$name;
$this->phone=$phone;
echo"php5<br>";
}
function__destruct(){
echo$this->name."php5end<br>";
}
//构造方法php4
functionPerson($name,$phone){
$this->name=$name;
$this->phone=$phone;
echo"php4<br>";
}
functionsay(){
echo"say sth! <br>";
}
functionrun(){
echo"running! <br>";
}
functionwork(){
echo"work <br>";
}
functiontoString(){
return$this->name ."<br>";
}
/**
* 获取私有对象
* Enter descriptionhere ...
* @param unknown_type$proName
*/
function__get($proName){
if($proName=="age"){
return$this->$proName-10;
}else{
return$this->$proName;
}
}
/**
* 设置私有对象
* Enter descriptionhere ...
* @param unknown_type$proName
* @param unknown_type$value
*/
function__set($proName,$value){
if($proName=="age"){
if($value>0&&$value<150) {
$this->$proName-10;
return;
}
}
$this->$proName=$value;

}
/**
* 判断私有属性是否存在
* Enter descriptionhere ...
* @param unknown_type$proName
*/
function__isset($proName){
echo"__isset<br>";
return isset($this->age);
}
/**
* 删除私有属性
* Enter descriptionhere ...
* @param unknown_type$proName
*/
function__unset($proName){
unset($this->$proName);
}
}
classStudentextendsPerson{
private$num;
functionwork(){
parent::work();
echo"this is student work";
}
}
/**
* 抽象类的存在和实现
* @author admin
*
*/
abstract classDemo{
functiontest(){
echo"this is a abstract demo test<br>";
}
abstract functiondemofun();
}
/**
* 接口中只有抽象方法和常量
* @author admin
*
*/
interfaceOne{
constONE="ONE! my boy<br>";
functiononeFun();
}
interfaceTwoextendsOne{
constTWO="TWO! my boy<br>";
}
interfaceThree{
constTHREE="TWO! my boy<br>";
functionthreeFun();
}
classDemoTestextendsDemoimplementsOne,Two{
function__construct(){}
functiondemofun(){
parent::test();
}
functiononeFun(){
echo"DemoTest impl oneFun<br>";
}
functionuseThree($thr){
$thr->threeFun();
}
}
classDemoImplFimplementsThree{
functionthreeFun(){
echo"DemoImplF impl threeFun<br>";
}
}
classDemoImplSimplementsThree{
functionthreeFun(){
echo"DemoImplS impl threeFun<br>";
}
}
/**
* 生成对象
* 并访问对象的属性和方法
* @var unknown_type
*/
$p1 = newPerson();
$p2 = newPerson();
$phone1 = newPhone();
$phone2 = newPhone();
//属性设置值
$p1->name="sid1";
$p2->name="sid2";
$phone1->color="red";
$phone2->color="blue";
$phone1->manufacruers="诺基亚";
$phone2->manufacruers="iphone";
$p1->phone=$phone1;
$p2->phone=$phone2;
//调用方法
$p1->phone->sendMessage($p2,"这是我的测试哦");
$str = $p1->toString();
echo$str;
$p1->age=15;
echo$p1->age."<br>";

//判断属性默认的无法判断私有的属性
if(isset($p1->age)){
echo"属性存在<br>";
}else{
echo"属性不存在<br>";
}

//删除对象的属性
unset($p1->name);
unset($p1->age);

//学生的操作
$s1 = newStudent("Java",newPhone());
$s1->num=12;
echo"学生类:".$s1->toString();
echo"学生类只有name:".$s1->name."<br>";

//抽象类和接口
$d = newDemoTest();
$d->demofun();
echoDemoTest::ONE;

//多态
$d = newDemoTest();
$df = newDemoImplF();
$ds = newDemoImplS();
$d->useThree($df);
$d->useThree($ds);

页: [1]
查看完整版本: php学习笔记(七)对象操作相关