标签 OOP 下的文章

概念:
抽象方法:类中有一个方法,而方法并没有方法体,这种方法叫作抽象方法
抽象类:只要包含抽象方法的类一定就是抽象类,而抽象类中不一定包含抽象方法,抽象类中可以同时包含普通方法和抽象方法。



- 阅读剩余部分 -

将对象或者数组串行化后,可以写入数据库中。
这是一个串行后的数组:

string(172) "a:5:{s:4:"name";s:25:"201712261823302368352.gif";s:4:"path";s:35:"/usr/uploads/2018/01/3072538610.gif";s:4:"size";i:526047;s:4:"type";s:3:"gif";s:4:"mime";s:9:"image/png";}"

转换成数组

将数组串行化成文本:

$string = serialize($array);

将串行文本转换成数组

$array = unserialize($string);

/*
# 单例设计模式
*/


class multiObj{
    public function __construct(){
        echo " DataBase Linked <br />";
    }
    public function select(){
        echo "select *";
    }
}

$obj1 = new multiObj(); # 生成 Obj#1
$obj2 = new multiObj(); # 生成 Obj#2
$obj3 = new multiObj(); # 生成 Obj#3
var_dump($obj1);
var_dump($obj2);
var_dump($obj3);



/* 单例设计模式,可以防止类被多次的实例化 */

class singleObj{
        static $obj = null; # 用来标记实例,默认不存在
        private function __construct(){
            echo "<br />DataBase Linked<br/>";
        }
        static function getObj(){
            if(is_null(self::$obj)){  # 判断实例是否存在
               self::$obj = new self(); 
               #不存在则实例化类生成实例 , singleObj()换成self()
            }
             return self::$obj;  # 存在实例,直接返回实例
        }
        public function select(){
            echo "select *";
        }
}

$sobj1 = singleObj::getObj(); # 不存在实例 生成Obj #4
$sobj2 = singleObj::getObj(); # 存在实例 返回Obj #4
$sobj3 = singleObj::getObj(); # 存在实例 返回Obj #4
var_dump($sobj1);
var_dump($sobj2);
var_dump($sobj3);

为了防止对象从外部克隆时生成重复对象,还应当增加一个private function __clone(){}方法。
基本上,要实现单例模式,需要禁用构造方法和克隆方法,禁用的方法也很简单,只要加上private 修饰即可。

final 关键字

出于安全考虑,被final修饰的类无法继承,被final修饰的方法无法被重写,关键字final只能用来修饰类和方法。

class parentClass{

    final public function show(){
        echo "This is a class named parentClass";
    }

}

class childClass extends parentClass{

    public function show(){
        echo "This is a class named childClass";
    }

}

childClass::show();

/* 
#
# final 关键字只能用来修饰类和方法,final 修饰的类不能被继承,
# final 修饰的方法不能被重写
#
*/

以上代码输出:

Fatal error: Cannot override final method parentClass::show() in *_class.php on line 17

static 关键字

static 可以用来修饰成员属性和成员方法,以声明该属性和方法为静态,静态属性和静态方法不需要实例化即可访问,访问方法为类名::$静态属性|静态方法()

在类的内部引用静态属性和静态方法时,不可使用$this->$属性|方法(),而应该使用self::$属性|方法()。换句话说,如果类中的成员属性和成员方法使用了static修饰的话,如果需要在类的其他方法中引用它们,就必须使用self::$属性|方法()来调用。

const 关键字

如果需要在类的内部定义常量,则需要使用const关键字,其基本语法是 const CONSTANT = 'CONSTANT VALUE';。在类的内部访问常量则需要定义专有方法,在类的外部访问常量和访问及静态属性类似,只要使用类名::CONSTANT即可。

instanceof 关键字

这个关键字用来判断当前对象是否是某个类实例化而来,其基本语法是 $obj instanceof Class,会返回一个布尔结果。

__set() 方法

class person{

    public $name;
    private $weight;
    protected $age;

    public function __construct($name,$weight,$age){
        $this->name = $name;
        $this->weight = $weight;
        $this->age = $age;
    }

    /*
    public function set($name,$value){ // 此处的$name 和属性$name 不同注意理解区分
        $this->$name = $value; // 注意$this->$name 中的$name的意义
        return $this->$name;
    }
    */

    # 自动调用 无需手工书写如$p->set($varName,$varVaule) 
    public function __set($name,$vaule){ 
         
        $this->$name = $vaule;
    }
    

    public function property(){
        echo "The weight for {$this->name}  is {$this->weight} kg , his age is {$this->age} years old " ;
    }

}

$bushou = new person('bushou',87,28);

/* 
# 手工调用set()方法
$bushou->set('weight',60);
$bushou->set('age',18);
var_dump($bushou); // 对象赋值之后,并不能使用$this->age或者$this->weight直接取到数据
*/

# 自动触发__set()方法
$bushou->weight = 60;
$bushou->age = 19;
var_dump($bushou);

以上代码运行后会输出:

object(person)#1 (3) {
["name"]=> string(6) "bushou"
["weight":"person":private]=> int(60)
["age":protected]=> int(19)
}

之前自己摸索着学习过一段时间的PHP编程,也尝试开发出了基于过程的单用户博客系统Slience. 由于想涉足大中型项目的实战开发,之前学习的那点皮毛根本是杯水车薪,于是趁着工作任务不重,打算系统的学习一下PHP开发。太过基础的内容并没有记在这里,因为都很容易掌握,关于面向对象的解释和理论也并没有放在这里,这里可能要花几篇的篇幅来记录一下对OOP开发过程中会常用到的一些方法和函数的理解。

- 阅读剩余部分 -