面向对象的一些东西

/**
 * 
 * 抽象类名和方法都必须用abstract
 * 抽象类不可以实例化,想使用,就必须用一个类去继承他,并且把他所有的
 * 抽象方法全部重写
 * 
 *
 */
abstract class man1{
    
    //子类的成员属性级别必须等于或弱于父类的
    public $a = '';
    //这样的函数为抽象函数,没有{}
    abstract public  function say();
    abstract public function eat();
    //也可以有不抽象的方法
    public function run()
    {
        
    }
    //对于静态的方法可以直接调用,只要不new就不会报错 man1::hello();
    public static function hello()
    {
       echo "hello"; 
    }
} /** * 如果子类不完全实现里面的抽象方法,则仍为抽象类,类名中需要带abstract * 如果都实现了,则为一个正常的类了 * * 目的:把你自己写的程序模块,加入到已经写好的程序中去,可以不用等你完成 * 给别人写一个规范,自己安装这来写,其他人也安装这个来写 * */ abstract class man2 extends man1{ //也可以有不抽象的方法 public function run() { } } /** * 接口:php中的类是单继承的,如果想多继承必须用接口实现 * 作用和抽象类相同|被实现的方式不一样 |接口中所有的方法都必须是抽象方法| * 成员属性只能声明常量|访问权限必须都是public * */ interface demo{ const user="song"; //必须是公有的 public function say(); } interface demo2 extends demo{ public function run(); } interface demo5 { public function drink(); } //可以用抽象类来实现接口中的部分方法 abstract class demo3 implements demo2{ abstract public function jump(); //可以增加新的抽象方法 } class people{ } //想让子类可以创建对象,必须全部实现它,可以同时继承多个接口 class demo4 extends people implements demo2,demo5{ public function say(){ } public function run(){ } public function drink(){ } } //因为常量不用实例化对象 echo demo::user; //用接口实现了php的多态(调用不同对象的相同函数,实现了不同的效果)
  
/**
 * final用了限制类不被继续,方法不被重写
 * static 修饰属性和方法(好处:以被一个类所共享(可以认为这是一个全局性的),省空间,好修改,存储在数据段中,在第一次加载的时候寸进去的,以后直接用,用类名访问)
 * 静态的东西都属于类级别的,不是对象级别的
 * 
 * __call()//调用不存在的方法时
 * __toString()//输出对象时
 * __clone()//$p= clone $p1;
 * __sleep(); 序列化(seralize)一个对象时调用,相当于序列话返回的数据,如果不写,则为全部的成员属性--操作成员属性
 * __wakeup();//直接操作成员属性
 * __set();
 * __get();
 * __isset();
 * __unset();
 */
/**
 * static 类型的变量是一个类所共有的,是多个对象所共享的
 * @author root
 *
 
*/
class man {
     
     static $name = "";
     static $objs = array();
     
     function __construct(){
         //记录该类创建的所有对象
         self::$objs[] = $this;
         
     }

    public function getA() {
        return self::$name;
    }

    public  function setA($name) {
        self::$name = $name;
    }

}

$p1 = new man();
$p2 = new man();

$p1->name = "song";
$p2->name = "jian";

ee(man::$objs);

/*
 * 运行结果
 * Array
(
    [0] => man Object
        (
            [name] => song
        )

    [1] => man Object
        (
            [name] => jian
        )

)
 
*/

 /*

 * 内存:
 * 栈内存:速度快,存大小固定的,固有空间小 如:整形
 * 堆内容:存不固定的,固有空间大 如:字符串,对象,数组
 * 代码段:方法,函数, if语句 结构等等 
 * 数据段:静态变量,常量共用的东西
 
*/
#self  用来访问当前类中的内容的关键字,类似 $this 关键字,但 $this 需要类实例化以后才可以使用
#
self 值可以访问静态属性,方法静态不静态都可以 
#
同理:parent用来访问父类的静态属性或所有方法
原文地址:https://www.cnblogs.com/siqi/p/2664528.html