PHP面向对象开发之魔术函数详解

 更新时间:2016年11月25日 15:00  点击:2114
php中魔术函数包括有tostring、call、clone、autoload几个常用的函数,希望此教程对各位朋友会有所帮助。

面向对象开发总结

1.对象的描述和配置。(可以理解为对对象的输出文字描述)
2.对象方法的一场处理。(可以理解为出现异常时候,自定义更人性化的错误信息)
3.克隆对象的应用。(可以理解为在原始对象上,克隆出一样的另一个对象,注意是另一个。)
4.自动载入对象的方法。(可以理解为引用)

1.对象描述和配置

方法名:__tostring()
格式:

 代码如下 复制代码
class My {
function __tostring() {
return "这里写这个类的文字描述"; //要用return,echo会出错。
}
}
$p = new My();
echo $p;

实例:

 代码如下 复制代码
<?php
class My {
 function __toString() {
  return "这个类的作用是,保卫地球。";
 }
}
$p = new My();
echo $p;
?>

2.对象方法的异常处理

调用一些不存在的对象方法的异常处理,是程序正常运行。
方法名:__call($funname,$arr_value)
格式:

 代码如下 复制代码
class My {
function __call($n,$v) {
echo "错误的方法名:".$n;
echo "错误的参数:".$v;
}
}

实例:

 代码如下 复制代码

<?php
class My {
 function __toString() {
  return "这个类的作用是,保卫地球。";
 }

 function __call ($n,$v) {
  echo "错误的方法<b>".$n."</b><br />";
    echo "错误的值<b>".print_r($v)."</b>"; //值是以数组方式传递的,所以要用print_r。
 }
}
$p = new My();
$p->demo("第一",6);
?>

3.对象的克隆

通过克隆方式可以在内存中生成两个一样的对象或升级原对象。(不是简单的赋值,而是在内存中开两块内存,克隆出的和被克隆的是2个属性方法一样的不同的两个对象)
方法名:__clone()
关键字:clone
格式:

 代码如下 复制代码
class My {
function __clone() {
echo "克隆时自动调用的函数";
}
}
$a = new My();
$b = clone $a;


实例:

 代码如下 复制代码

<?php
class My {
 public $name = "小猪";
 function __toString() {
  return "这个类的作用是,保卫地球。";
 }

 function __call ($n,$v) {
  echo "错误的方法<b>".$n."</b><br />";
    echo "错误的值<b>".print_r($v)."</b>"; //值是以数组方式传递的,所以要用print_r。
 }
}
$p = new My();
$b = clone $p;

echo $b->name="小猪头"."<br />"; //这是克隆并修改后的对象,如果使用 $b = $p,那修改$b->name="小猪头";后,再输出$p,也会被修改。
echo $p->name; //这是原对象,它已经被$b克隆了,其他都一样,但是他们是独立的。
?>


4.自动载入对象的方法


快速取得对象名称并自动载入进当前页面
方法名:__autoload()
格式:

 代码如下 复制代码
function __autoload($class_n) {
include($class_n.".php");
}
$p = new MyPc(); //自动调用执行如下
$d = new demo(); //include("mypc.php")

实例:

 代码如下 复制代码

<?php
function __aotoload ($class_name) {
 include($class_name.".php"); //写在类外部。
}

$p = new class_name(); //这里实例化的类名就被上面的函数变量 $class_name 替代了,非常方便。
?>

php中上传文件必须知道几个技巧,一个必须是由表单post过去的数据,然后由php move_uploaded_file进行接受了,再保存到服务器指定路径即可。

1.form 标签 enctype 属性。

2.$_FILES 系统函数。 //将上传内容转换为数组。

3.move_uploaded_file 函数。 //移动存放在缓存文件夹里的上传文件到指定文件夹。

4.is_uploaded_file 函数。 //判断是否存在。

---------------------------------------

1.form 标签

格式:<form enctype="multipart/form-data" ... ...>
      <input name="upfile" type="file">

2.$_FILES 系统函数
$_FILES['name'] //客户端上传文件原文件名。
$_FILES['type'] //文件的MIME类型,如:“image/gif”
$_FILES['size'] //上传文件大小,字节为单位。
$_FILES['tmp_name'] //临时文件名,一般为默认。
$_FILES['error'] //上传相关情况代码(0:成功,1:超过php.ini设置大小。2:超过PHP文件代码指定大小。3:文件只有部分被上传。4:没有文件被上传。5:上传文件大小为0。)

3.move_uploaded_file 函数
上传后移动文件到目标位置的函数
move_uploaded_file(临时文件,目标位置和文件名;)

4.is_uploaded_file 函数
判断上传MIME类型的文件函数
is_uploaded_file(MIME);

---------------------------------------

实例:

 代码如下 复制代码
<form enctype="multipart/form-data" action="upload.php" method="post">
<input type="hidden" name="max_file_size" value="100000">
<input name="userfile" type="file">  
<input type="submit" value="上传文件">
</form>

注意

1、表单中enctype=”multipart/form-data”必须指定,以便让服务器知道文件带有常规的表单信息。
2、必须有一个可以设置上传文件最大长度的表单区域,即允许上传文件的最大值(按字节计算),它是隐藏值域,即max_file_size,通过设置其Value(值)可以限制上传文件的大小,避免用户在花时间等待上传大文件之后才发现该文件太大了的麻烦。但是一般别人可以绕过这个值,所以安全起见,最好是在php.ini文件中配置upload_max_filesize选项,设定文件上传的大小,默认是2M

 代码如下 复制代码

function uploadfile($type,$name,$ext,$size,$error,$tmp_name,$targetname,$upload_dir)
{
    $MAX_SIZE = 2000000;
    $FILE_MIMES = array('image/pjpeg','image/jpeg','image/jpg','image/gif','image/png');
    $FILE_EXTS = array('.jpg','.gif','.png','.JPG','.GIF','.PNG');

    $file_path = $upload_dir.$targetname;
   
    if(!is_dir($upload_dir))
    {
        if(!mkdir($upload_dir))
            die("文件上传目录不存在并且无法创建文件上传目录");
        if(!chmod($upload_dir,0755))
            die("文件上传目录的权限无法设定为可读可写");
    }
   
    if($size>$MAX_SIZE)
        die("上传的文件大小超过了规定大小");

    if($size == 0)
        die("请选择上传的文件");

    if(!in_array($type,$FILE_MIMES) || !in_array($ext,$FILE_EXTS))
        die("请上传符合要求的文件类型");

    if(!move_uploaded_file($tmp_name, $file_path))
        die("复制文件失败,请重新上传");

    switch($error)
    {
        case 0:
            return ;
        case 1:
            die("上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值");
        case 2:
            die("上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值");
        case 3:
            die("文件只有部分被上传");
        case 4:
            die("没有文件被上传");
    }
}

如何上传多个文件?比如同时上传3个文件

 代码如下 复制代码

只需将


 <input name="userfile" type="file">

改成

<input name="userfile[]" type="file">
<input name="userfile[]" type="file">
<input name="userfile[]" type="file">

对应的在调用此函数时,$_FILES['userfile']['name'][0],代表第一个文件的相关文件信息,依此类推,其他也一样。

 

一些关于php性能配置,有必须时我们也可以修改一下

max_execution_time = 30 ;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time = 60 ;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit = 128m ;每个PHP页面所吃掉的最大内存,默认128M。如果觉得小了,可以设置大点。128够用。
max_execution_time = 600
max_input_time = 600
upload_max_filesize = 32m
post_max_size = 32m

如果文件大小限制了我们可以如下解决

打开php.ini,首先找到

file_uploads = on ;是否允许通过HTTP上传文件的开关。默认为ON即是开

upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹

upload_max_filesize = 8m ;望文生意,即允许上传文件大小的最大值。默认为2M

post_max_size = 8m ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M

一般地,设置好上述四个参数后,上传<=8M的文件是不成问题,在网络正常的情况下。

但如果要上传>8M的大体积文件,只设置上述四项还一定能行的通。

 
进一步配置以下的参数

max_execution_time = 600 ;每个PHP页面运行的最大时间值(秒),默认30秒

max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒

memory_limit = 8m ;每个PHP页面所吃掉的最大内存,默认8M

把上述参数修改后,在网络所允许的正常情况下,就可以上传大体积文件了

max_execution_time = 600
max_input_time = 600
memory_limit = 32m
file_uploads = on
upload_tmp_dir = /tmp
upload_max_filesize = 32m
post_max_size = 32m

本文章来给各位同学介绍关于PHP面向对象开发之类的多态详解,希望此教程对各位同学有所帮助。

类的多态

1.多态的介绍和优势。
2.运算符:instanceof。
3.多态的简单应用。

1.多态的介绍和优势

介绍:多态性是继承抽象和继承后,面向对象语言的第三特征。

例子:USB接口,插上不同的东西会使用不同的功能。

优势:OOP并不仅仅是把很多函数和功能集合起来,目的而是使用类,继承,多态的方式描述我们生活中的一种情况。

 
2.运算符:instanceof

PHP一个类型运算符,用来测定一个给定的对象是否来自指定的对象
格式:

 代码如下 复制代码

class A {}
class B {}

$thing = new A;
if ($thing instanceof A) {
echo "A";
}
if ($thing instanceof B) {
echo "B";
}

3.多态的简单应用
实例1:

 代码如下 复制代码

<?php
class A {

}

class B {

}

$new = new A;

if ($new instanceof A) {
echo "A";
}
if ($new instanceof B) {
echo "B";
}
?>

实例2:

 代码如下 复制代码

<?php
interface MyUsb {
 function type();
 function alert();
}

class Zip implements MyUsb {
 function type() {
  echo "2.0";
 }
 function alert() {
  echo "U盘驱动正在检测……<br />";
 }
}

class Mp3 implements MyUsb {
 function type() {
  echo "1.0";
 }
 function alert() {
  echo "MP3驱动正在检测……";
 }
}

class MyPc {
 function Add_Usb($what) {
  $what->type();
  $what->alert();
 }

}
$p = new MyPc();

$zip = new Zip();

$mp3 = new Mp3();

$p->Add_Usb($zip);
$p->Add_Usb($mp3);
?>

补充一个实例213.29.11.16更新

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>继承和多态</title>
</head>

<body>
<?php
/*  父类  */
class MyObject{
 public $object_name;         //图书名称
 public $object_price;          //图书价格
 public $object_num;          //图书数量
 public $object_agio;          //图书折扣
 function __construct($name,$price,$num,$agio){    //构造函数
  $this -> object_name = $name;
  $this -> object_price = $price;
  $this -> object_num = $num;
  $this -> object_agio = $agio;
 }
 function showMe(){          //输出函数
  echo '这句话不会显示。';
 }
}
/*  子类Book  */
class Book extends MyObject{         //MyObject的子类。
 public $book_type;          //类别
 function __construct($type,$num){       //声明构造方法
  $this -> book_type = $type;
  $this -> object_num = $num;
 }
 function showMe(){          //重写父类中的showMe方法
  return '本次新进'.$this -> book_type.'图书'.$this->object_num.'本<br>';
 }
}
/*  子类Elec  */
class Elec extends MyObject{         //MyObject的另一个子类
 function showMe(){          //重写父类中的showMe方法
  return '热卖图书:'.$this -> object_name.'<br>原价:'.$this -> object_price.'<br>特价:'.$this -> object_price * $this -> object_agio;
 }
}
/*  实例化对象  */
$c_book = new Book('计算机类',1000);       //声明一个Book子类对象
$h_elec = new Elec('PHP函数参考大全',98,3,0.8);     //声明一个Elec子类对象
echo $c_book->showMe()."<br>";        //输出Book子类的showMe()方法
echo $h_elec->showMe();         //输出Elec子类的是showMe()方法
?>
</body>
</html>

php类中接口的应用关键字是interface、implements了,接口是一种成员属性全部为抽象或常量的特殊抽象类,下面我们看几个实例。

类中接口的应用

1.关键字:interface
2.关键字:implements

1.接口的介绍与创建

接口:一种成员属性全部为抽象或常量的特殊抽象类。

规则:

1.类中全部为抽象方法。
2.抽象方法钱不用加abstract。
3.接口抽象方法属性为public。
4.成员属性必须为常量。

格式:

 代码如下 复制代码

interface demo {
const NAME = "常量对象属性";

function fun1();
function fun2(); //抽象方法。
}


2.接口的应用与规范

接口引用区别于类继承关键字 extends ,继承只能只是单一性,而接口可以使用关键字 implements 多个引用并用逗号分开

1.格式:普通类引用接口

class MyPc implements demo , demo2 , demo3 {
...
}

2.格式:抽象类应用接口例子

abstract class MyPc implements demo , demo2 , demo3 {
...
}

3.格式:继承父类引用接口并存

class MyPc extends Root implements demo , demo2 , demo3 {
...
}

先继承后接口,单继承多接口。

4.格式:接口与接口的继承

interface demo3 extends demo {
...
}

实例:

 代码如下 复制代码

<?php
interface demo {
 const NAME = "名称";
 function fun1();
 function fun2();
}

interface demo2 {
 function fun3();
 function fun4();
}

interface demo3 {
 const TEST = "Test";
 function fun5();
}

class MyPc implements demo, demo2 {
 function fun1() {
  echo "++++++++++<br />";
 }
 function fun2() {
  echo "----------<br />";
 }
 function fun3() {
  echo "1111111111<br />";
 }
 function fun4() {
  echo "2222222222<br />";
 }
}

class MyPs extends MyPc implements demo3 {
 function fun5() {
  echo "继承类后引用接口";
 }
}
$p = new MyPs;
$p->fun1();
$p->fun2();
$p->fun3();
$p->fun4();
$p->fun5();
?>

接口使用关键字 interface 来定义,并使用关键字 implements 来实现接口中的方法,且必须完全实现。

例子:

 代码如下 复制代码

<?php
//定义接口
interface User{
    function getDiscount();
    function getUserType();
}
//VIP用户 接口实现
class VipUser implements User{
    // VIP 用户折扣系数
    private $discount = 0.8;
    function getDiscount() {
        return $this->discount;
    }
    function getUserType() {
        return "VIP用户";
    }
}
class Goods{
    var $price = 100;
    var $vc;
    //定义 User 接口类型参数,这时并不知道是什么用户
    function run(User $vc){
        $this->vc = $vc;
        $discount = $this->vc->getDiscount();
 $usertype = $this->vc->getUserType();
        echo $usertype."商品价格:".$this->price*$discount;
    }
}

$display = new Goods();
$display ->run(new VipUser); //可以是更多其他用户类型
?>

运行该例子,输出:

VIP用户商品价格:80 元

该例子演示了一个 PHP 接口的简单应用。该例子中,User 接口实现用户的折扣,而在 VipUser 类里面实现了具体的折扣系数。最后商品类 Goods 根据 User 接口来实现不同的用户报价。

该例子仅限于演示 PHP 接口的用法,不涉及其科学与否。

实现多个接口

PHP也可以在继承一个类的时候同时实现多个接口:

class 子类 extends 父类 implemtns 接口1, 接口2, ...
{
    ......
}


抽象类和接口的区别


接口是特殊的抽象类,也可以看做是一个模型的规范。接口与抽象类大致区别如下:

1.一个子类如果 implements 一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法即可。
2.如果一个接口中定义的方法名改变了,那么所有实现此接口的子类需要同步更新方法名;而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已(相对老的方法实现)。
3.抽象类只能单继承,当一个子类需要实现的功能需要继承自多个父类时,就必须使用接口。

php中类的常用关键字包括有:锁(fianl)、有点类似与this关键字(self)、静态属性(static)、常量关键字(const)下面我来给大家整理整理。

类中的常用关键字

1.fianl:锁
2.self:有点类似与this关键字
3.static:静态属性
4.const:常量关键字


1.关键字:fianl

用来定义类和方法的一个重要关键字,当定义类的时候该类不能被继承,用来定义方法的时候该方法不能被重载。

1. final不成修饰成员属性(类中常不是用这个关键字)

2. final只能修饰类和方法

作用:

使用final修饰的类 不 能被子类继承

使用final修饰的方法不能被子类去覆盖

用来限制类不被继承,方法不被覆盖就使用fianl


类使用 final 关键字的例子:

final class Person
{
    ......
}

final 定义的类被继承时会提示如下错误:

Fatal error: Class Student may not inherit from final class (Person) in ...

方法使用 final 关键字的例子:

class Person
{
    final function say()
    {
        ......
    }
}

Example #1 Final 方法示例

 代码如下 复制代码

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

class ChildClass extends BaseClass {
   public function moreTesting() {
       echo "ChildClass::moreTesting() calledn";
   }
}
// 产生 Fatal error: Cannot override final method BaseClass::moreTesting()
?>

Example #2 Final 类示例

 代码如下 复制代码

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

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

2.关键字:self

在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者static,那么就必须使用操作符->。

另外,如果从类的内部访问const或者static变量或者方法,那么就必须使用自引用的self,反之如果从类的内部访问不为const或者static变量或者方法,那么就必须使用自引用的$this


格式:

self::类内部成员(属性或者方法)
|| 等价于
类名::类内部成员(属性或者方法)

注意:因为没有数理化类访问内部属性或方法是没有意义的,所以self一般用来访问类中的:静态成员,常量,其他定义的内容。

 

3.关键字:static

内存优化,用来定义静态属性或方法,可以在类未被实例化时就能使用。静态属性单独占用内存,而不会因创建多个对象而重复占用内存。

格式:
class class1 {
static $name;
static function fun1 {
...
}
}

静态成员的访问(类内部):
self::静态成员
类名称::静态成员

静态成员的访问(类外部):
类名称::静态成员


4.关键字:const

用来定义类中的常量,只能修饰类当中的成员属性。
格式:

class class1 { //建议用大写定义,不使用$符号。
const NAME;
...
}

看个PHP const小例子吧:

 代码如下 复制代码

< ?php  
class say_const{  
const CHARSET="中国";  
publice function say_hello()
{  
echo slef::CHARSET;  
}  
}  
$const1=new say_const()  
$const1->say_hello();  
?>  

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • java8如何用Stream查List对象某属性是否有重复

    这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • JavaScript预解析,对象详解

    这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • 如何在Spring WebFlux的任何地方获取Request对象

    这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • 牛叉的Jquery――Jquery与DOM对象的互相转换及DOM的三种操作

    只有jQuery对象才能调用jQuery类库的各种函数,同样有些dom对象的属性和方法在jQuery上也是无法调用的,不过基本上jQuery类库提供的函数包含了所有的dom操作。这就需要我们知道如何将jQuery对象和DOM的相互转换的方法。1...2015-10-30
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30