首页 > 编程技术 > php

php获取当前类名函数名方法

发布时间:2016-11-25 14:57

今天分析了一下THINKPHP框架的模板自动加载功能,其中运用到了获取到当前类与方法。所以查了些资料,在此和大家分享分享

__FUNCTION__ 函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
__CLASS__ 类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
__METHOD__ 类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

注:这些常量前后均是两个下划线。

get_class(class name);//取得当前语句所在类的类名
get_class_methods(class name);//取得class name 类的所有的方法名,并且组成一个数组
get_class_vars(class name);//取得class name 类的所有的变亮名,并组成一个数组

魔术常量 php向它运行的任何脚本提供了大量的预定义常量了,我们常用的php魔术常量有 __CLASS__ __FUNCTION__ __LINE__ __FILE__ __DIR__ __METHOD__了,下文来看一个测试例子。

直接贴测试代码:

 代码如下 复制代码

class MoShu{
 public function moshu() {
  echo '当前类名:' . __CLASS__ . "<br />";
  echo '当前方法名:' . __FUNCTION__ . "<br />";
  echo '当前文件中所在的行数:' . __LINE__ . "<br />";
  echo '当前文件绝对路径:' . __FILE__ . "<br />";
  echo '当前文件所在的绝对路径的文件夹:' . __DIR__ . "<br />";
  echo '返回类名::方法名:' . __METHOD__ . "<br />";
 }
}


$moshu = new moshu();
$moshu->moshu();

结果如下:

当前类名:MoShu
当前方法名:moshu
当前文件中所在的行数:10
当前文件绝对路径:D:\xampp\htdocs\test\moshu.php
当前文件所在的绝对路径的文件夹:D:\xampp\htdocs\test
返回类名::方法名:MoShu::moshu
当前类名:MoShu
当前方法名:moshu
当前文件中所在的行数:10
当前文件绝对路径:D:\xampp\htdocs\test\moshu.php
当前文件所在的绝对路径的文件夹:D:\xampp\htdocs\test
返回类名::方法名:MoShu::moshu

下文我们一起来看看PHP5.6新特性,虽然本文总结的PHP5.6新特性不是很全面也有不少的例子,希望对大家带来帮助。

PHP5.6已经发布Alpha版,预示着下一个大版本的升级即将到来,PHP5.6带来了哪些新特性?本文将介绍这些特性,并讨论它们可以给开发者带来哪些好处。

常量标量表达式(Constant scalar expressions)

在常量、属性声明和函数参数默认值声明时,以前版本只允许常量值,PHP5.6开始允许使用包含数字、字符串字面值和常量的标量表达式。

 代码如下 复制代码

<?php
const ONE = 1;
const TWO = ONE * 2;

class C {
    const THREE = TWO + 1;
    const ONE_THIRD = ONE / self::THREE;
    const SENTENCE = 'The value of '.THREE.' is 3';

    public function f($a = ONE + self::THREE) {
        return $a;
    }
}

echo (new C)->f()."\n";
echo C::SENTENCE;

上面代码输出:

4
The value of THREE is 3
可变参数函数(Variadic functions via ...)

可变参数函数的实现, 不再依赖func_get_args()函数,现在可以通过新增的操作符...更简洁地实现。

 代码如下 复制代码

<?php
function f($req, $opt = null, ...$params) {
    // $params is an array containing the remaining arguments.
    printf('$req: %d; $opt: %d; number of params: %d'."\n",
           $req, $opt, count($params));
}

f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
上面代码输出:

$req: 1; $opt: 0; number of params: 0
$req: 1; $opt: 2; number of params: 0
$req: 1; $opt: 2; number of params: 1
$req: 1; $opt: 2; number of params: 2
$req: 1; $opt: 2; number of params: 3

参数解包功能(Argument unpacking via ...)

在调用函数的时候,通过...操作符可以把数组或者可遍历对象解包到参数列表,这和Ruby等语言中的扩张(splat)操作符类似。

 代码如下 复制代码

<?php
function add($a, $b, $c) {
    return $a + $b + $c;
}

$operators = [2, 3];
echo add(1, ...$operators);

上面代码输出:

6
导入函数和常量(use function and use const)

use操作符开始支持函数和常量的导入。use function和use const结构的用法的示例:

 代码如下 复制代码

<?php
namespace Name\Space {
    const FOO = 42;
    function f() { echo __FUNCTION__."\n"; }
}

namespace {
    use const Name\Space\FOO;
    use function Name\Space\f;

    echo FOO."\n";
    f();
}
上面代码输出:

42
Name\Space\f
phpdbg

PHP自带了一个交互式调试器phpdbg,它是一个SAPI模块,更多信息参考phpdbg文档。

php://input可以被复用

php://input开始支持多次打开和读取,这给处理POST数据的模块的内存占用带来了极大的改善。

大文件上传支持

可以上传超过2G的大文件。

GMP支持操作符重载

GMP对象支持操作符重载和转换为标量,改善了代码的可读性,如:

 代码如下 复制代码

<?php
$a = gmp_init(42);
$b = gmp_init(17);
 
// Pre-5.6 code:
var_dump(gmp_add($a, $b));
var_dump(gmp_add($a, 17));
var_dump(gmp_add(42, $b));

// New code:
var_dump($a + $b);
var_dump($a + 17);
var_dump(42 + $b);

新增gost-crypto哈希算法

采用CryptoPro S-box tables实现了gost-crypto哈希算法,详情参考RFC 4357, section 11.2。

SSL/TLS改进

OpenSSL扩展新增证书指纹的提取和验证功能,openssl_x509_fingerprint()用于提取X.509证书的指纹,SSL stream context 选项: capture_peer_cert 用于获取对方X.509证书;peer_fingerprint用于断言对方证书和给定的指纹匹配。

另外,可以通过SSL流上下文选项crypto_method指定加密方法,如SSLv3或TLS,目前支持的选项值包括STREAM_CRYPTO_METHOD_SSLv2_CLIENT, STREAM_CRYPTO_METHOD_SSLv3_CLIENT, STREAM_CRYPTO_METHOD_SSLv23_CLIENT (默认), or STREAM_CRYPTO_METHOD_TLS_CLIENT。

SecureCRT中文乱码肯定是设置的问题了,我们只要简单的修改一下SecureCRT设置就可以解决中文问题,下面一聚教程小编为各位介绍一下吧。


 修改SecureCRT的设置。找到“选项”->“会话选项”->“外观”:
    *    字符编码设置为utf-8。
    *    字体设置,选择中文字体,设置常用字体:新宋体。
如图:

SecureCRT中文乱码问题解决办法

单例模式是php中一个用得比较多的设计模式了,虽然很多人对于单例模式有居多说法,但是并不影响它的强大,下面我来给各位介绍自己在学习单例模式的笔记。

概要

创建型模式
保证一个类仅有一个实例,并且提供一个访问它的全局访问点

特点

1、一个类只有一个实例
2、它必须自行创建这个实例
3、必须自行向整个系统提供这个实例

结构图

Singleton

主要角色

Singleton 定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类方法。负责创建它的唯一的实例。

优缺点

1、对唯一实例的受控访问
2、缩小命名空间 单例模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染命名空间
3、允许对操作和表示的精华 单例类可以有子类。而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。
4、允许可变数目的实例(多例模式)
5、比类操作更灵活

适用性

1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
2、当这个唯一实例应该是通过子类化可扩展的。并且用户应该无需更改代码就能使用一个扩展的实例时。

单例模式php实例

 代码如下 复制代码

<?php
         /**
         * 单例模式
         * ————-
         * @author         zhaoxuejie <zxj198468@gmail.com>
         * @package     design pattern
         * @version     v1.0 2011-12-14
         */
        class Singleton {
           
            //私有静态成员变量,保存全局实例
            private static $instance = NULL;
           
            //私有构造方法,保证外界无法直接实例化
            private function __construct(){}
           
            //静态方法,返回此类唯一实例
            public static function getInstance(){
                if(!isset(self::$instance)){
                    $c = __CLASS__;
                    self::$instance = new $c;
                }
                return self::$instance;
            }
           
            //测试用方法
            public function info(){
                return ‘ok’;
            }
           
            //防止克隆
            public function __clone(){
                throw new Exception(‘Error: Clone is not allowed.’);
            }
        }
        $s = Singleton::getInstance();
        echo $s->info();
 ?>

补充我看到另一篇关于单例模式介绍

 代码如下 复制代码

<?php
class EasyFramework_Easy_Mysql{
    protected static $_instance = null;
    private function __construct(){

    }
    public static function getInstance(){
        if (self::$_instance === null){
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    protected function __clone(){

    }

}
$x = EasyFramework_Easy_Mysql::getInstance();
var_dump($x);

?>

/*
 * 1.第一步:
 * 既然是单例,也就是只能实例化一次,也就代表在实例化时
 * 不可能使用new关键字!!!!
 * 在使用new关键字时,类中的构造函数将自动调用。
 * 但是,如果我们将构造函数的访问控制符设置为protected或private
 * 那么就不可能直接使用new关键字了!!!
 * 第二步:
 * 无论protected/private修饰的属性或方法,请问在当前类的
 * 内部是否可以访问?---> 可以
 * 第三步:
 * 现在我们根本没有办法得到对象(因为你不能使用new关键字了),
 * 第四步:静态成员(包括属性或方法)在访问时,只能通过
 * 类名称::属性()
 * 类名称::方法()
 * 第五步:如果我现在存在一个静态方法--> getInstance()
 * 那么在调用时就应写成
 * $object = EasyFramework_Easy_Mysql::getInstance()
 * 如果,getInstance()方法可以得到唯一的一个对象
 * 也就代表是所谓的单例模式了!!!
 * 第六步,怎么让getInstace()只得到一个对象呢?
 * 既然要得到对象,那么肯定是:
 * $variabl = new ????();
 * 我们又知道静态属性的值是可以所有的对象来继承的!!!
 * 静态成员是属于类的,而非对象的!
 * 所以:
 * 第七步:声明一个静态的属性,用其存储实例化的对象
 * protectd static $_instance
 *
 * 并且初始值为null
 * 那么我在调用getInstance()方法时,只需要判断其值是否为空即可
 *
 * public static function getInstance(){
 *     if(self::_instance === null){
 *      self::_instance = new self();
 *  }
 *  return self::_instance;
 * }
 * 在实例时,一定是这样写:
 * $x = EasyFramework_Easy_Mysql::getInstance();
 * 在第一时调用时,类的$_instance这个静态属性值为null,
 * 那么也就代表,getInstance()方法的判断条件为真了,
 * 也就意味着
 * self::$_instance这个成员有了值了!!!
 * 并且还返回这个值
 * $y = EasyFramework_Easy_Mysql::getInstance();
 * 在第二次或第N次调用时,self::$_instance已经有了值了
 * 也就代表getInstance()方法的条件为假了!!!
 * 也就代表其中的程序代表不可能执行了!!!
 * 也就代表将直接返回以前的值了!!!
 *
 *
 *
 * */

标签:[!--infotagslink--]

您可能感兴趣的文章: