文档章节

PHP 面向对象编程中的一些函数操作

IamOkay
 IamOkay
发布于 2014/11/16 11:39
字数 918
阅读 76
收藏 4
点赞 0
评论 0
  1. get_object_vars函数,将对象中有访问权限的的字段转为数组

<?php
class foo {
    private $a;
    public $b = 1;
    public $c;
    private $d;
    static $e;
   
    public function test() {
        var_dump(get_object_vars($this));
    }
}

$test = new foo;
var_dump(get_object_vars($test));
$test->test();

?>

结果

array(2) {
  ["b"]=>
  int(1)
  ["c"]=>
  NULL
}
array(4) {
  ["a"]=>
  NULL
  ["b"]=>
  int(1)
  ["c"]=>
  NULL
  ["d"]=>
  NULL
}

2.array get_class_methods ( mixed $class_name )与array get_class_vars ( string $class_name )

得到类中的所有可访问的方法

<?php

class myclass {
    // constructor
    public  function myclass()
    {
        return(true);
    }

    // method 1
    protected function myfunc1()
    {
        return(true);
    }

    // method 2
    private function myfunc2()
    {
        return(true);
    }
    
    public function description()
    {
        
        $class_methods = get_class_methods($this);
        //or
        $class_methods = get_class_methods(__CLASS__);
        foreach ($class_methods as $method_name) {
            echo "$method_name\n";
        }
    }
}

$class_methods = get_class_methods('myclass'); 
//得到所有公开的方法名称
foreach ($class_methods as $method_name) {
    echo "$method_name\n";
}
//结果是==》myclass description

$class_methods = get_class_methods(new myclass());
//得到所有公开的方法名称,注意,构造方法为private或者protected时报错
foreach ($class_methods as $method_name) {
    echo "$method_name\n";
}
//结果是==》myclass description

$t = new myclass();
$t->description();
//结果是==》myclass myfunc1 myfunc2 description
?>

2.__call魔术方法

在php官方描述中是调用不存在的方法时调用,这个定义不太完整,正确的定义是调用不存在或者非public的方法时触发

<?php

class User {
  
    // method 1
    protected function say()
    {
        return(true);
    }

    // method 2
    private function sing()
    {
        return(true);
    }

    public function __call($name,$args)
    {
        $t = func_get_args();  //在默认函数中总用比较明显

        print_r($t);
    }
}

$m = new User();
$m->say(); //不触发
$m->sing();//触发
$m->talk();//触发
?>

2.__set,__get,__unset,__isset

有些时候对象为了适应变化,比如Model的字段经常改变,需要零时改变字段,这时需要动态的添加或者删除属性

<?php
class PropertyTest {
     //动态数据存储容器
    private $data = array(); 

     /**  重载不能被用在已经定义的属性  */
    public $declared = 1;

     /**  只有从类外部访问这个属性时,重载才会发生 */
    private $hidden = 2;

    public function __set($name, $value) 
    {
       // $this->$name = $value;  //这种也是一种动态扩容的方式,但管理起来比较麻烦
        $this->data[$name] = $value;
    }

    public function __get($name) 
    {
        echo "Getting '$name'\n";
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }

        $trace = debug_backtrace();
        trigger_error(
            'Undefined property via __get(): ' . $name .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);
        return null;
    }

    /**  PHP 5.1.0之后版本,调用,使用 isset判断时调用 */
    public function __isset($name) 
    {
        echo "Is '$name' set?\n";
        return isset($this->data[$name]);
    }

    /**  PHP 5.1.0之后版本,删除某个属性时 */
    public function __unset($name) 
    {
        echo "Unsetting '$name'\n";
        unset($this->data[$name]);
    }

    /**  非魔术方法  */
    public function getHidden() 
    {
        return $this->hidden;
    }
}


echo "<pre>\n";

$obj = new PropertyTest;

$obj->a = 1;
echo $obj->a . "\n\n";

var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";

echo $obj->declared . "\n\n";

echo $obj->getHidden() . "\n";

echo $obj->hidden . "\n";
?>

代码中如下片段,类似于日志跟踪工具

  $trace = debug_backtrace();
  trigger_error(
            'Undefined property via __get(): ' . $name .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);

4.get_class,  get_parent_class,interface_exists,is_subclass_of,is_a,instanceOf

<?php
if(!interface_exists('man'))
{
    interface man
    {
        public function talk($msg);
    }
}

class dad {
    function dad()
    {
    // implements some logic
    }
}

class child extends dad implements man
{
   
    public function __toString()
    {
         return "I'm ".get_parent_class($this)."'s son\n";
    }

     public function talk($msg)
     {
        echo $msg;
     }
}

class child2 extends dad {
    public function __toString()
    {
        return "I'm ".get_parent_class('child2')."'s son too\n";
    }
}

$foo = new child();
$bar = new child2();
$dad = new dad();

echo '<pre>';

 var_dump(get_class($dad));
 var_dump(get_class($foo));
 var_dump(get_class($bar));

echo "<hr/>";

var_dump(get_parent_class($dad));
var_dump(get_parent_class($foo));
var_dump(get_parent_class($bar));

echo "<hr/>";

var_dump(is_subclass_of($foo,'dad'));
var_dump(is_subclass_of($foo,'child')); //child类不是child类的子类,返回false
var_dump(is_subclass_of($foo,'man'));

echo "<hr/>";

var_dump(is_subclass_of('child','dad'));
var_dump(is_subclass_of('child','child'));//child类不是child类的子类.返回false
var_dump(is_subclass_of('child','man'));

echo "<hr/>";
var_dump(is_a($foo,'dad'));//is_a等价于 instanceOf
var_dump(is_a($foo,'man'));
var_dump(is_a($foo,'child'));

echo "<hr/>";

var_dump(($foo instanceof dad));
var_dump(($foo instanceof child));
var_dump(($foo instanceof man));
?>

结果如下

string(3) "dad"
string(5) "child"
string(6) "child2"
-------------------------------------------------------------------
bool(false)
string(3) "dad"
string(3) "dad"
-------------------------------------------------------------------
bool(true)
bool(false)
bool(true)
-------------------------------------------------------------------
bool(true)
bool(false)
bool(true)
-------------------------------------------------------------------
bool(true)
bool(true)
bool(true)
-------------------------------------------------------------------
bool(true)
bool(true)
bool(true)


好了,今天就到这里


© 著作权归作者所有

共有 人打赏支持
IamOkay
粉丝 187
博文 458
码字总数 369998
作品 0
海淀
程序员
PHP 学习必备技能(基础略过)

1.面向对象编程 面向对象编程基本概念 类和对象的关系 如何定义类 成员属性(变量) 如何创建对象实例及如何访问对象属性 对象在内存中存在的形式 栈、堆、全局区、常量区和代码区的关系 成员方...

风雪中的舞者
2015/08/05
0
0
PHP 中的 MVC 模式

我不是一个PHP粉,但我喜欢把PHP变成面向对象的语言。要让PHP完全OOL化,还要做许多事情,也有很多开发企业级应用程序使用了PHP的支持。通过接口和类对象的使用,让PHP开发人员开发可重复使用...

迷途d书童
2012/09/21
5.4K
3
现货!《PHP7实践指南:o2o网站与App后台开发》京东天猫有售

终于发售了,啥也不想说了,喜欢的或需要的就点击 链接 进去购买吧。 另外此书将作为 2017 PHP全球开发者大会 现场活动用书 天猫购书 包邮 PHP7实践指南:O2O网站与App后台开发 数据库设计 PH...

szxy1234
2017/11/02
0
0
PHP V5.3 中的新特性,第 1 部分: 对象接口的变化

PHP V5 和面向对象编程 与 PHP V4 提供的特性相比,2004 年发布的 PHP V5 在面向对象编程(OOP)和设计方面向前迈出了很大的一步。它提供了一些必要的改进,例如类可见性、合适的构造函数和解...

未来十年
2011/12/19
0
0
PHP开发经验总结

1.使用内嵌的HTML代码,而不是PHP的echo语句。 因为PHP是一门嵌入式Web编程语言,可以将HTML代码和PHP代码相互嵌入。但是很多程序员担心在HTML代码中过多的使用”"嵌入PHP代码会多次调用PHP...

技术小大人
2017/11/15
0
0
PHP V5.3 中的新特性,第 2 部分: 闭包及 lambda 函数

闭包函数和 lambda 函数绝对不是新出现的概念;它们均来自函数编程领域。函数编程 是一种编程风格,它将关注点从执行命令转移到表达式计算。这些表达式是使用函数构成的,结合这些函数可以得...

未来十年
2011/12/19
0
0
小解 php闭包 lambda 函数

闭包函数和 lambda 函数绝对不是新出现的概念;它们均来自函数编程领域。函数编程 是一种编程风格,它将关注点从执行命令转移到表达式计算。这些表达式是使用函数构成的,结合这些函数可以得...

lincoln.yu
2013/07/23
0
0
作为初学者,php,python和ruby应学哪个?

  【IT168 评论】对于web开发初学者来说,最大的问题就是学习哪种编程语言更适合未来的职业发展并且更有前景。你要考虑都有哪些编程语言,各自的优缺点是什么、每种编程语言的学习周期有多...

it168网站
2017/03/01
0
0
Python-面向对象

(个人感觉真心不错 ,转过来一起学习一下 ) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分...

ala9981
2016/03/20
0
0
PHP V5.3 中的新特性

PHP V5.3 计划在 2008 年底发行,这个版本包含了大量在过去一直处于计划阶段的新特性。PHP V5.3 在最初被誉为 “只缺少原生 Unicode 支持的 PHP V6”,现在它已经是 PHP V5 系列的全面升级。...

红薯
2008/12/09
159
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
0
0
Android 复制和粘贴功能

做了一回搬运工,原文地址:https://blog.csdn.net/kennethyo/article/details/76602765 Android 复制和粘贴功能,需要调用系统服务ClipboardManager来实现。 ClipboardManager mClipboardM...

她叫我小渝
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
6
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1
fiddler安装和基本使用以及代理设置

项目需求 由于开发过程中客户端和服务器数据交互非常频繁,有时候服务端需要知道客户端调用接口传了哪些参数过来,这个时候就需要一个工具可以监听这些接口请求参数,已经接口的响应的数据,这种...

银装素裹
今天
0
0
Python分析《我不是药神》豆瓣评论

读取 Mongo 中的短评数据,进行中文分词 对分词结果取 Top50 生成词云 生成词云效果 看来网上关于 我不是药神 vs 达拉斯 的争论很热啊。关于词频统计就这些,代码中也会完成一些其它的分析任...

猫咪编程
今天
0
0
虚拟机怎么安装vmware tools

https://blog.csdn.net/tjcwt2011/article/details/72638977

AndyZhouX
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部