PHP中关键字与魔术方法介绍

PHP中常用的关键字

final  

1、final只能修饰类和方法,不能修饰成员属性   作用:使用修饰的类不能被继承,修饰的方法不能被覆盖

PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被声明为

final,则不能被继承。

Example #1 Final 方法示例

 代码如下 复制代码

<?php
class BaseClass {
   public function test() {
       echo "BaseClass::test() called\n";
   }
  
   final public function moreTesting() {
       echo "BaseClass::moreTesting() called\n";
   }
}

class ChildClass extends BaseClass {
   public function moreTesting() {
       echo "ChildClass::moreTesting() called\n";
   }
}
// 产生 Fatal error: Cannot override final method BaseClass::moreTesting()
?>
Example #2 Final 类示例

<?php
final class BaseClass {
   public function test() {
       echo "BaseClass::test() called\n";
   }
  
   // 这里无论你是否将方法声明为final,都没有关系
   final public function moreTesting() {
       echo "BaseClass::moreTesting() called\n";
   }
}

class ChildClass extends BaseClass {
}
// 产生 Fatal error: Class ChildClass may not inherit from final class (BaseClass)
?>

static 
 
1.使用static可以修饰成员属性和成员方法,不能修饰类  
2.用static修饰的成员属性,可以被同一个类的所有对象共享  
3.静态的数据是存在于内存中的数据段中(初使化静态段)  
4.静态的数据是在类第一次加载时分配到内存中的,后面用到时就可以直接使用了  
5.只要在程序中有这个类名出现,即是类被加载,静态数据就会被分配到内存中了   注:静态的成员都要使用类名访

问,不用创建对象,不要用对象去访问静态成员。   访问方法 类名::静态成员   如果在类中使用静态成员,可以使

用self代表本类   访问方法 self::静态成员  
6.静态方法不能访问非静态成员,非静态方法可以访问静态成员,因为非静态成员必须用对象来访问,而静态成员不需

例1

 代码如下 复制代码

<?php
function test()
{
    static $var1=1;
    $var1+=2;
    echo $var1.' ';
}

test();
test();
test();
?>

例2

例子:

 代码如下 复制代码

<?php
Class Person{
    // 定义静态成员属性
    public static $country = "中国";
    // 定义静态成员方法
    public static function myCountry() {
        // 内部访问静态成员属性
        echo "我是".self::$country."人<br />";
    }
}
class Student extends Person {
    function study() {
        echo "我是". parent::$country."人<br />";
    }
}
// 输出成员属性值
echo Person::$country."<br />";  // 输出:中国
$p1 = new Person();
//echo $p1->country;   // 错误写法
// 访问静态成员方法
Person::myCountry();   // 输出:我是中国人
// 静态方法也可通过对象访问:
$p1->myCountry();

// 子类中输出成员属性值
echo Student::$country."<br />"; // 输出:中国
$t1 = new Student();
$t1->study();    // 输出:我是中国人
?>

运行该例子,输出:

中国
我是中国人
我是中国人
中国
我是中国人

首先,我们知道PHP中调用实例方法都是通过如:someobj->someFun()调用,那么我们调用静态函数是否也能像C#那样

通过SomeClass->someFun()调用呢?答案是否定的,在PHP中,对静态成员的调用只能通过::的方式进行,如:

SomeClass::someFun()。

 

 代码如下 复制代码
<?php
class TestC
{
    public static $var1=1;
    public $var2=1;
    function t1()
 {
        self::$var1+=2;
        echo self::$var1.'&nbsp;';
        echo $this->var2.'&nbsp;';
    }
    public static function t2()
 {
        self::$var1+=2;
        echo self::$var1.'&nbsp;';
    }
}
$t=new TestC();
$t->t1();
TestC::t2();
?>

const  
1.const只能修饰成员属性  
2.类中使用const声明常量  
3.用法类似定义一般常量  
4.访问方式和静态成员是一样的(在类外 类名::常量名,类内 self::常量名)  
5.常量一定要在声明时就给初值

语法:

const constant = "value";
例子:

 代码如下 复制代码

<?php
Class Person{
    // 定义常量
    const country = "中国";

    public function myCountry() {
        //内部访问常量
        echo "我是".self::country."人<br />";
    }
}

// 输出常量
echo Person::country."<br />";

// 访问方法
$p1 = new Person();
$p1 -> myCountry();
?>

运行该例子输出:

中国
我是中国人

PHP中小常用魔术方法:

__call()   在调用对象中不存在的方法时,就会调用此方法。就会出现系统报错,然后程序会退出。声明此方法来对

错误进行操作,阻止程序崩溃。

__toString()   直接输出对象引用时调用,用来快速获取对象的字符串表示的最便捷的方式

 代码如下 复制代码

<?php
// Declare a simple class
class TestClass
{
    public $foo;

    public function __construct($foo)
    {
        $this->foo = $foo;
    }

    public function __toString() {
        return $this->foo;
    }
}

$class = new TestClass('Hello');
echo $class;
?>

 

void __clone ( void )
当复制完成时, 如果定义了__clone()方法, 则新创建的对象(复制生成的对象)中的__clone()方法会被调用, 可

用于修改属性的值(如果有必要的话)。

 

 代码如下 复制代码

<?php
class SubObject
{
    static $instances = 0;
    public $instance;

    public function __construct() {
        $this->instance = ++self::$instances;
    }

    public function __clone() {
        $this->instance = ++self::$instances;
    }
}

class MyCloneable
{
    public $object1;
    public $object2;

    function __clone()
    {
     
        // 强制复制一份this->object, 否则仍然指向同一个对象
        $this->object1 = clone $this->object1;
    }
}

$obj = new MyCloneable();

$obj->object1 = new SubObject();
$obj->object2 = new SubObject();

$obj2 = clone $obj;

print("Original Object:\n");
print_r($obj);

print("Cloned Object:\n");
print_r($obj2);

?>

__autoload()   其它的魔术方法都是在类中添加起作用,这个是唯一一个不在类中添加的方法   只要在页面中使用

到一个类,只要用到类名就会自动传进此方法

 代码如下 复制代码

<?php
session_start();
require_once 'MyClass.php';
$obj = new MyClass;
$_SESSION['obj'] = $obj;
?>

Works fine.  Then on a subsequent page load:

 代码如下 复制代码

<?php
session_start();
require_once 'MyClass.php';
$_SESSION['obj']->callSomeMethod();
?>

Fatal error:  The script tried to execute a method or access a property of an incomplete object. Please

ensure that the class definition "MyClass" of the object you are trying to operate on was loaded

_before_ unserialize() gets called or provide a __autoload() function to load the class definition.

But if you do this instead, it works fine:

 代码如下 复制代码

<?php
require_once 'MyClass.php';
session_start();
$_SESSION['obj']->callSomeMethod();
?>

对象串行化:将一个对象转化为二进制串   1.将对象长时间存储在数据库或文件中时   2.将对象在多个PHP文件中传

输时   serialize():参数是一个对象,返回的是一个二进制串   unserialize():参数是对象的二进制串,返回的就是

新生成的对象    __sleep()   在序列化时自动调用的方法(serialize)   作用:可以将一个对象部分序列化   只要

这个方法中返回一个数据组,数组中有几个成员属性就序列化几个成员属性,如果不加,所有成员属性都被序列化 

__wakeup()   在反序列化时自动调用的方法(unserialize)   也就是对象重新诞生的一个过程

注意事项:PHP把所有以__(两个下划线)开头的类方法当成魔术方法。所以当你定义类方法时,除了上述魔术方法,

建议不要以 __为前缀。

时间: 2024-09-20 06:03:24

PHP中关键字与魔术方法介绍的相关文章

PHP中的常见魔术方法功能作用及用法实例

  这篇文章主要介绍了PHP中的常见魔术方法功能作用及用法实例,本文讲解了构造函数和析构函数__construct()和__desctruct()以及属性重载(Property Overloading)__get()和.__set().__isset()等等魔术方法,需要的朋友可以参考下 概述 在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利.PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发.这篇文章简单总结了PHP中提

php中的常用魔术方法汇总_php技巧

这篇文章详细的对php中的常用魔术方法进行了整理归纳,分享给大家供大家参考,具体内容如下 1.PHP把所有"__"开头的方法当做魔术方法,所以任何自定义的方法都不能是"__"开头 php提供的重载,是指动态的创建属性或方法.重载是通过魔术方法来实现的.这些魔术方法的参数不能饮用传递,__get(),__set(),__isset(),__unset(),实现类属性重载. 2.当访问类中不可访问的属性时,将调用__get()方法 3.当访问类中不可访问的属性时,根据不

PHP中的常见魔术方法功能作用及用法实例_php实例

概述 在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利.PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发.这篇文章简单总结了PHP中提供的魔术方法. 开始之前 在总结PHP的魔术方法之前先来定义两个类,以便后边示例使用: 复制代码 代码如下: <?php class Device {     public $name;               public $battery;            public $d

Ruby中操作文件的方法介绍

  这篇文章主要介绍了Ruby中操作文件的方法介绍,是Ruby学习当中的基础知识,需要的朋友可以参考下 Ruby提供了一套完整的I/O相关的内核模块中实现方法.所有I/O方法来自IO类. 类IO提供了所有的基本方法,如 read, write, gets, puts, readline, getc 和 printf. 本章将涵盖所有可供在Ruby中使用的基本I/O功能.如需使用更多的功能,请参考Ruby的IO类. puts 语句: 在前面的章节中,你指定值的变量和然后使用声明 puts 输出.

在EXCEL表格中使用透视表方法介绍

  EXCEL表格可以说使我们最常用的一个办公软件了,透视表可以让我们更加清晰的看到我们在数据源中需要的部分的数据,可以节约大量的时间,这样分析出来的数据也比较的准确,更加浅显易懂,今天我就来给大家介绍一下透视表的用法,用它来统计分析数据可以直观的看出问题所在,给领导们做决策提供强有力的依据. 方法/步骤 第一步.启动excel程序,打开一张你需要透视的数据源的表格,然后我们要选中我们需要透视的部分,一般我自己会用"Ctrl+A"选中整张表,如图所显 2.鼠标点击表格上方的插入选项,然

JavaScript中setter和getter方法介绍_javascript技巧

javascript中的setter.getter是平时接触比较少的方法,其本身也并不是标准方法,只在非ie浏览器里支持(ie内核也许有其他方法可以做到呢?暂时不知其解),但是加以利用可以做许多事情,比如: 1.对数据的访问限制: a.value是对value变量的getter方法调用,如果在getter方法实现中抛出异常,可以阻止对value变量的访问 2.对dom变量进行监听: window.name是一个跨域非常好用的dom属性(大名鼎鼎,详见百度),如果覆盖window.name的set

php中的常用魔术方法总结_php技巧

常用的魔术方法有:__Tostring ()  __Call()  __autoLoad()  __ clone()  __GET()   __SET()    __isset()  __unset() 1.__Tostring()   用于定义输出对象引用时调用  常用于打印一些对象的信息 必须有返回值eg:有一个persion类Persion per =new persion()Echo per;    //直接调用会出错我们可以在类的定义中添加__tostring()方法 复制代码 代码如

JAVA中 终止线程的方法介绍_java

在Java的多线程编程中,java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume().通过这些方法,我们可以对线程进行方便的操作,但是这些方法中,只有start()方法得到了保留. 在Sun公司的一篇文章<Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? >中详细讲解了舍弃这些方

自己了解php中sql注入一些方法介绍

何为注入? 比如我们在查询数据库的时候,我们通过文章的id号来取出这篇文章的所有信息.那么SQL语句可以这样写:  代码如下 复制代码 select * from blog where id=5  id的值通过用户的操作来传递,一般是GET方式,形如read.php?id=5.这样看起来是没有任何问题,但是如果我们稍微改下SQL语句:  代码如下 复制代码 select * from blog where id=5 or 1=1  1=1这个是恒等的,那么这条语句就会取出所有的文章.要修改这个只