码迷,mamicode.com
首页 > Web开发 > 详细

php面向对象-常见关键字和魔术方法

时间:2015-11-23 16:49:02      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

一、常见关键字和魔术方法

1、final

使用final 标识的类不能被继承

在类中使用final 表示成员的方法,在子类中不能被覆盖

注意:不能用final 标识成员属性

1

<?php

    final class Person{

        public $name;

    }

    

    class Stu extends Person{

    

    }

运行之后:Fatal error: Class Stu may not inherit from final class (Person)

例2

<?php

    class Person{

        final function say(){

        }

    }

    

    class Stu extends Person{

        function say(){

        }

    }

运行之后:Fatal error: Cannot override final method Person::say()

2、static

(1)使用static 关键字可以将类中的成员表识为静态的,可以修饰成员属性和成员方法,但不能修饰类

(2)调用静态成员属性

 a、在类的外部调用可以用 类名::静态属性名

 b、在类的内部调用可以用 类名::静态属性名 还可以 用 self::静态属性名

(3)调用静态成员发法

 a类的外部调用可以用 类名::静态方法名

 b、在类的内部调用可以用 类名::静态方法名 还可以 用 self::静态方法名

 c、对于静态方法,我们可以使用对象的形式调用 对象->静态方法名()

(4)静态的东西只会被初始化一次。执行效率很高!

 

如果在类的内部 构造方法是私有的

/1.创建私有并且是静态的成员属性,为它赋予初始值null

//2.将构造方法私有化(目的:不能在类的外部通过new来实例化)

//3.编写静态公有方法,在该方法中判断静态段中是否已经有了该对象,如果有,直接返回该对象,如果没有创建该对象

1

<?php

static $a=100;

echo $a; //输出200

static $a=200;

echo $a; //输出200

例2

<?php

static $a=array();

$a[‘a‘]=‘a‘;

$a[‘b‘]=‘b‘;

static $a=array(c,d);

echo "<pre />";

print_r($a);

//输出:Array(

[0] => c

[1] => d

[a] => a

[b] => b)

例:3

<?php

    class Person{

       static $count;

     

       function __construct(){

            self::$count++;

        }

        

        static  function getCount(){

            return self::$count;

       }

    }

    

    Person::$count=0;

    $person1=new Person();

    $person2=new Person();

    $person3=new Person();

    $person4=new Person();

    echo Person::getCount(); //输出 4

    echo $person3 -> getCount(); //输出 4

3、const:将类中的成员属性定义为常量。

(1)声明

 a使用关键字 const 声明一个常量,

 b常量不能带$符号

 c常量不能用访问控制修饰符修饰

 d常量声明立刻要被赋予初始值

(2)使用

 a、在类的内部使用

   类名::常量名

  self::常量名

 b、在类的外部使用

  类名::常量名

例:

<?php

class Myclass{

    const CONSTANT = "CONSTANT value";

 

    function showCounstant(){

        echo self::CONSTANT."<br />";

    }

}

 

echo MyClass::CONSTANT."<br />"; //输出  CONSTANT value

$class = new MyClass();

$class -> showCounstant(); //输出  CONSTANT value

4instanceof:使用这个关键字可以确定一个对象是类的实例,类的子类,还是实现了某个特定接口,并进行相应的操作。

5clone:克隆对象

通过clone关键字克隆出来的副本。两个对象完全独立,但他们中的成员及成员属性值完全一样,如果需要对克隆后的副本对象重新赋值,可以使用 __clone()魔法方法,该方法中自动包含$this 和 $that 两个对象引用,$this 是副本对象的引用,$that 是原本对象的引用。

例:

<?php

    class Person{

        private $name;

        private $sex;

        private $age;

 

        function __construct($name,$sex,$age){

            $this -> name = $name;

            $this -> sex = $sex;

            $this -> age = $age;

        }

//声明此方法则在对象克隆时自动调用,用来为新的对象重新赋值

        function say(){

            echo "我的名字是:$this->name 我的性别是:$this->sex 我的年龄是:$this->age <br /> ";

        }

 

        function __clone(){

            //1.等号左边的$this指代克隆(新的)的对象

//2.等号右边的$this指代被克隆(原来的)的对象

$this -> name = "我是{$this->name}的副本";   //为副本对象中的name 重新赋值

            $this -> age = "10"; //为副本对象中的age 重新赋值

        }

    }

$person1 = new Person("张三","",20);

$person2 = clone $person1;  //使用clone克隆对象,并自动调用__clone() 方法

 

$person1 -> say(); //调用原对象的说话方法,打印原对象中的全部属性值

$person2 -> say(); //调用副本对象的说话方法,打印副本对象中的全部属性值

输出结果:

我的名字是:张三 我的性别是:男 我的年龄是:20 
我的名字是:我是张三的副本 我的性别是:男 我的年龄是:10 

 

6、__toString:快速获取对象的字符串表示的最便捷的方式,它是在直接输出对象时自动调用的方法。

调用时机:当在类的外部想直接输出对象的时候会被自动调用

参数???没有

方法体中主要是返回一个字符串(其他数据类型不可以)

例:

<?php

class TestClass{

    private $foo;  //在类中声明一个成员的方法

    function __construct($foo){

        $this -> foo = $foo;

    }

 

    public function __toString(){ //在类中定义一个 __toString()方法

        return $this -> foo; //返回一个成员属性 $foo 的值

    }

}

 

$obj = new TestClass("Hello"); /

echo $obj; //直接输出对象引用,则会自动调用__toString()方法

// 输出  Hello

7、__call:当调用对象中不存在的方法时,会自动调用该方法,且程序也可以继续往下执行

有另个参数:第一个参数是调用不存在的方法时,接收这个方法名称字符串,而参数列表则以数组的形式传递到__call()方法的第二个参数中。

例:

<?php    

class TestClass{

    function printHello(){

        echo "Hello<br />";

    }

 /**

 *声明魔术方法 __call(),用来处理对象中不存在的方法

 *$functionNam     访问不存在的成员的方法名称字符串

 *$args            访问不存在的成员方法中传递的参数数组

 * */

    function __call($functionName,$args){

        echo "你所调用的函数:".$functionName."(参数:"; //输出调用不存在的方法名

        print_r($args); //输出不存在的方法时的参数列表

        echo ")不存在!<br />\n"; //输出附加的一些提示信息

    }

}

 

$person = new TestClass();

$person -> myFun("one",2,"three");

$person -> otherFun(8,9);

$person -> printHello();

输出结果:

你所调用的函数:myFun(参数:Array ( [0] => one [1] => 2 [2] => three ) )不存在!
你所调用的函数:otherFun(参数:Array ( [0] => 8 [1] => 9 ) )不存在!
Hello

8、自动加载类(__autoload()全局函数)

调用时机:在本脚本中实例化一个类的时候会被自动调用

参数 1个,要被实例化的类名

在方法体中,我们可以使用require的方式获取该类所在的文件

例:在同一目录下

文件1shop.class.php

<?php

class shop{

public $name;

}

文件2user.class.php

<?php

class shop{

public $name;

}

文件3main.php

<?php

    function __autoload($name){

        include (strtolower($name).".class.php");  //在方法中使用include 包含类所在的文件

    }

    

    $peron = new user(); //user 方法不存在时,自动调用__autoload()函数,将类名“user”作为参数载入 自动 “include  user.class.php

    $person2 = new shop(); //shop 方法不存在时,自动调用__autoload()函数,将类名“shop”作为参数载入  自动 “include  shop.class.php

 

9、对象串行化

 

例:

<?php

class Person{

    private $name;

    private $sex;

    private $age;

 

    function __construct($name,$sex,$age){

        $this->name = $name;

        $this->sex = $sex;

        $this->age = $age;

    }

 

    function say(){

        echo "我的名字是:$this->name 我的性别是:$this->sex 我的年龄是:$this->age ";

    }

}

 

 

$person = new Person("张三","",29);

$person_string = serialize($person); //串行化

file_put_contents("file.txt",$person_string);  

//被串行化的结果  O:6:"Person":3:{s:12:" Person name";s:6:"张三";s:11:" Person sex";s:3:"";s:11:" Person age";i:29;}

 

$person_string = file_get_contents("file.txt");

$person = unserialize($person_string); //反串行化

$person -> say();

//调用say() 方法解析之后结果: 我的名字是:张三 我的性别是:男 我的年龄是:29 

 

10、单态设计模式

例:

<?php

    define ("HOST","localhost");

    define ("USER","root");

    define ("PASS","123321");

    define ("DBNAME","xiaogou");

 

    class DB{

        static public $count;

       static public $i;

       static function getDb(){

           if(!(bool)(self::$count)){

self::$count = new DB();  //如果本类中的count为空,说明还没有被实例化过

            }  

             return self::$count;    //返回本类的对象

        }

 

        private function __construct(){

            mysql_connect(HOST,USER,PASS);

            mysql_select_db(DBNAME);

            self ::$i++;

        }

        

        function select($tbname){

            $sql = "select * from $tbname";

            $result = mysql_query($sql);

            while($rows=mysql_fetch_assoc($result)){

                $row[]=$rows;

            }return $row;

        }

    }

 

    $db=DB::getDb(); //通过静态的方法去获取静态方法getDb()去获取DB类的对象

    $arr = $db->select("liuyan");   //访问对象中的成员

    echo "<pre />";

    var_dump($arr);  

php面向对象-常见关键字和魔术方法

标签:

原文地址:http://www.cnblogs.com/youy/p/4988619.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!