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

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

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

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

5、clone:克隆对象

通过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的方式获取该类所在的文件

例:在同一目录下

文件1:shop.class.php

<?php

class shop{

public $name;

}

文件2:user.class.php

<?php

class shop{

public $name;

}

文件3:main.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);

时间: 2024-08-06 01:05:45

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

PHP面向对象常见的关键字和魔术方法

在PHP5的面向对象程序设计中提供了一些常见的关键字,用来修饰类.成员属性或成员方法,使他们具有特定的功能,例如final.static.const等关键字.还有一些比较实用的魔术方法,用来提高类或对象的应用能力,例如__call().__toString().__autoload等. ①final关键字的应用 final关键字的作用如下:a.实用final标识的类,不能被继承.b.在类中使用final标识的成员方法,在子类中不能被覆盖. 在下面的例子中声明一个MyClass类,并使用final

面向对象中的常用魔术方法

__autoload($classname);这个魔术方法与其他魔术方法不同的是,它不是在类中使用的,其他都是在类内部使用,只要在页面中用到一个类,就会自动将这个类名传给这个函数的参数.在开发中用它来自动加载类. __sleep():是在对象序列化也叫串行化时,自动调用的方法,因为对象序列化的时候serialize($object),如果类里不加这个魔术方法,会自动将类中的所有属性全部序列化,如果只想让某些属性被序列化,就要用到这个方法,这个方法返回一个由类的属性组成的数组.序列哪个属性就将那个

面向对象中所有的魔术方法和关键字

魔术方法构造函数,对类里面成员进行初始化function __construct(){}析构函数,在对象释放的时候自动执行function __destruct(){} __set方法function __set($name,$value){}                                                          __set和__get  主要用在封装里面__get方法function __get($name){} __tostring()方法    

PHP中的面向对象OOP中的魔术方法

一.什么是魔术方法: PHP为我们提供了一系列用__开头的函数,这些函数无需自己手动调用,会在合适的时机自动调用,这类函数称为魔术函数.例如: function __construct(){} 在new一个新对象时自动调用此函数 二.PHP中都有那些魔术方法,以及它们的作用:1.__construct():构造函数,new对象时自动调用 eg: class Person{ public $name; public $age; function __construct($name,$age){ $

前端学PHP之面向对象系列第二篇——魔术方法

显示目录 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这些方法为面向对象实现提供了便利,本文将详细介绍魔术方法 构造方法 大多数类都有一种称为构造函数的特殊方法.当创建一个对象时,它将自动调用构造函数,通常用它执行一些有用的初始化任务 构造函数的声明与其它操作的声明一样,只是其名称必须是两个下划线__construct( ).这是PHP5中的变化:

[麦先生]PHP面向对象中常见的魔术方法以及关键字

麦先生引言:在学习php面向对象的编程思想中,我们会遇到很多的能够自动调用的魔术方法,每个魔术方法都有其特定的触发场景,但其根本目的是在于编写和实际使用过程中阻止程序报错而生; 常见的魔术方法有:music=> gusic(根据首字母拼音大写由gusic联想到music)    以及构造,析构方法,以及特殊的关键字fsci -- cats 和 ai 魔术方法                触发场景 <!--gusic---------------------------------------

php中12个魔术方法

本文列举了php面向对象当中12个魔术方法,并对此进行一一详细介绍,希望对新手有所帮助. 1.构造方法: __construct() 参数:自定义 触发时机:new的一瞬间自动调用 作用:初始化成员属性 2.析构方法__destruct() 参数:无 触发时机:在对象释放的一瞬间自动调用 作用:做收尾工作,数据库关闭连接等 3.__get() 参数:一个,成员属性名称 触发时机:在类外部访问私有的受保护的或者未定义的成员属性时自动调用 作用:控制私有的受保护的未定义的成员属性的访问 4.__se

数据持久化、单例、重载【添加对不可访问的成员的操作】、魔术方法、类常量、static关键字对self的补充【静态延迟绑定实现$this的效果】、参数类型约束【参数前加类名】、遍历【iterator接口】、快速排序

1.数据持久化过程[传输(例如表单提交或php交互mysql)和保存过程] 使用的是字符串形式的流数据. 数据流就是为了传输[按照序列的形式进行传输] [http://baike.baidu.com/link?url=0MtUQMhFzc_EwJc09rXZV8KlfOL4jis6XNbRfmGA3rQhDcGwOp8togLVQjXBV34M] 所以将其他类型数据转化为字符串的过程也是序列化的过程 [这个概念和图片.视频的流媒体的区别?] [注意点] 另外mysql中sql语句中的某些关键词为

PHP 面向对象中常见关键字使用(final、static、const和instanceof)

PHP 面向对象中常见关键字的使用: 00x1.Final :final关键字可以加在类或者类中方法之前,但是不能使用final标识成员属性. 作用: 使用final标识的类,不能被继承. 在类中使用final标识的成员方法,在子类中不能覆盖. 总结:final表示为最终的意思,所以使用final关键字的类或者类中的成员方法是不能被更改的. 00x2.Static :static关键字将类中的成员属性或者成员方法标识为静态的,static标识的成员属性属于整个类,static成员总是唯一存在的,