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

  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)

好了,今天就到这里

时间: 2024-10-09 22:32:42

PHP 面向对象编程中的一些函数操作的相关文章

socket编程之三:socket网络编程中的常用函数

这节本来打算先给出常用函数介绍,再给两个代码实例,写着写着发现越来越长,决定把代码放在下一节. 本节内容持续更新...... 1 socket()函数 原型: int socket(int domain, int type, int protocol); 描述: 类似打开一个文件,返回一个socket描述符,唯一标识一个socket,后面相应的操作都是这用这个socket描述符. 参数: domain:协议族,常用的协议族有AF_INET.AF_INET6.AF_LOCAL.AF_ROUTE等:

linux编程中接收主函数返回值以及错误码提示

程序A创建子进程,并调用进程B,根据不调用的不同情况,最后显示结果不同. #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #include <errno.h> int main() { pid_t pid, rpid; int stat; if ((pid = fork()) < 0) { perror("for

面向对象编程中的设计模式

面向对象编程中的设计模式 最近在复习(预习)软考,看到了设计模式这个知识点,打算小做总结一下~~ 设计模式分为三种类型,共23种.(红色标注常用的) 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式. 行为型模式:模版方法模式.命令模式.迭代器模式.观察者模式.中介者模式.备忘录模式.解释器模式(Interpreter模式).状态模式.策略模式.职责链模式(责任链模式).访问者模式.

Python编程中自定义Lambda函数的使用场景

Python 中定义函数有两种方法,一种是用常规方式 def 定义,函数要指定名字,第二种是用 lambda 定义,不需要指定名字,称为 Lambda 函数. Lambda 函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦.有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可. 好比电影里面的群众演员,往往他们的戏份很少,最多是衬托主演,跑跑龙套,他们需要名字吗?不需要,因为他们仅仅只是临时出镜,下次可能就用不着了,所以犯不着费心思给他们每个

在PHP编程中常用的函数

<?php//===============================时间日期===============================//y返回年最后两位,Y年四位数,m月份数字,M月份英文.d月份几号数字,D星期几英文$date=date("Y-m-d");$date=date("Y-m-d H:i:s");//带时分秒 //include,include_once.require,require_once//require("file

PHP高级编程中关于PHP函数的介绍

PHP函数 在PHP中,函数是一段PHP代码的集合,通过调用函数就可以执行一些任务或返回一些结果.PHP脚本通常是由主程序和函数构成的,这些函数不仅构成了PHP脚本的主要功能,也实现了程序代码的结构化,方便他人阅读. 函数可以分为用户自定义函数和系统函数,用户自定义函数是有用户自行编写实现的,功能也由用户所编写的代码来决定.系统函数是PHP系统或扩展库内置的函数,这些函数一般已经存在,直接调用即可. 一.用户自定义函数 定义函数的格式如下: function function_name([$pa

socket编程中服务器端常用函数 以及简单实现

1 常用函数 1.1   socket() int socket(int family, int type, int protocol); socket()打开一个网络通讯端口,如果成功的话,返回一个文件描述符,应用程序可以像读写文件一样用read/write在网络上收发数据,如果socket()调用出错则返回-1.对于IPv4,family参数指定为AF_INET.对于TCP协议,type参数指定为SOCK_STREAM,表示面向流的传输协议.如果是UDP协议,则type参数指定为SOCK_D

python编程中的闭包函数

什么是闭包? 简单说,闭包就是根据不同的配置信息得到不同的结果 再来看看专业的解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外.所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体. 看概念总是让人摸不着头脑,看几个python小例子就会了 例1 def make_adder(addend):     def adder(augend):      

C# 面向对象编程中如何定义类,理解各个关键字的作用

第一:基本类的定义 1 class Person 2 { 3 //我是一个Person类,默认类的修饰符是intenal,只能在当前程序集中访问 4 } 和上面案例一样的类定义如下,二者意思一样 1 internal class Person1 2 { 3 //我是一个Person1类,允许当前程序集中访问,其它项目不能访问 4 } 第二:声明可以在当前程序集中访问也可以在其它项目中访问的类,定义如下 1 public class Person2 2 { 3 //我是一个Person2类,可以在