php interface_exists、class_exists、method_exists和property_exists介绍
1. interface_exists、class_exists、method_exists和property_exists:
顾名思义,从以上几个函数的命名便可以猜出几分他们的功能。我想这也是我随着对PHP的深入学习而越来越喜欢这门编程语言的原因了吧。下面先给出他们的原型声明和简短说明,更多的还是直接看例子代码吧。
bool interface_exists (string $interface_name [, bool $autoload = true ]) 判断接口是否存在,第二个参数表示在查找时是否执行__autoload。
bool class_exists (string $class_name [, bool $autoload = true ]) 判断类是否存在,第二个参数表示在查找时是否执行__autoload。
bool method_exists (mixed $object , string $method_name) 判断指定类或者对象中是否含有指定的成员函数。
bool property_exists (mixed $class , string $property) 判断指定类或者对象中是否含有指定的成员变量。
代码如下 | 复制代码 |
} class AnotherTestClass { <?php print "The following case is tested before executing autoload.n"; if (!interface_exists('AnotherTestInterface',false)) { print "nThe following case is tested after executing autoload.n"; if (interface_exists('AnotherTestInterface',true)) { |
运行结果如下:
bogon:TestPhp$ php class_exist_test.php
The following case is tested before executing autoload.
This class doesn't exist if no autoload.
This interface doesn't exist if no autoload.
The following case is tested after executing autoload.
This class exists if autoload is set to true.
This interface exists if autoload is set to true.2. get_declared_classes和get_declared_interfaces:
分别返回当前可以访问的所有类和接口,这不仅包括自定义类和接口,也包括了PHP内置类和接口。他们的函数声明非常简单,没有参数,只是返回数组。见如下代码:
代码如下 | 复制代码 |
} class AnotherTestClass { print_r(get_declared_interfaces()); |
由于输出结果过长,而且这两个函数也比较简单,所以下面就不再给出输出结果了。
3. get_class_methods、get_class_vars和get_object_vars:
这三个函数有一个共同点,即只能获取作用域可见范围内的所有成员函数、成员变量或非静态成员变量。比如在类的内部调用,则所有成员函数或者变量都符合条件,而在类的外部,则只有共有的函数和变量可以返回。
array get_class_methods (mixed $class_name) 获取指定类中可访问的成员函数。
array get_class_vars (string $class_name) 获取指定类中可以访问的成员变量。
array get_object_vars (object $object) 获取可以访问的非静态成员变量。
代码如下 | 复制代码 |
class TestClass { private function privateFunction() { } $testObj = new TestClass(); print "nThe following is output out of TestClass.n";
The following is output out of TestClass. string get_class ([ object $object = NULL ]) www.111Cn.net获取参数对象的类名称。
class Derive extends Base { Base::test(); var_dump(get_class(new Base())); 运行结果如下: bogon:TestPhp$ php another_test_class.php |
5. get_parent_class、is_a和is_subclass_of:
这三个函数都是和类的继承相关,所以我把他们归到了一起。
string get_parent_class ([ mixed $object ]) 获取参数对象的父类,如果没有父类则返回false。
bool is_a (object $object, string $class_name) 判断第一个参数对象是否是$class_name类本身或是其父类的对象。
bool is_subclass_of (mixed $object, string $class_name) 判断第一个参数对象是否是$class_name的子类。
代码如下 | 复制代码 |
<?php class Derive extends Base { var_dump(get_parent_class(new Derive())); var_dump(is_subclass_of(new Derive(),'Derive'));
|
例
代码如下 | 复制代码 |
<?php $test=0; if($test==''){ if($test===''){ if($test==NULL){ if($test===NULL){ if($test==false){ if($test===false){ ?> |
原因是在PHP中变量是以C语言的结构体来存储的,空字符串和NULL,false都是以值为0存储的,其中这个结构体有个zend_uchar type;这样的成员变量,他是用来保存变量的类型的,而空字符串的类型是string,NULL的类型是NULL,false是boolean。
这一点可以用echo gettype('');和echo gettype(NULL);来打印看看!而===运算符是不单比较值,还有比较类型的,所以第三个为false!
所以可以这样说===是等于下面的函数:
代码如下 | 复制代码 |
function eq($v1, $v2) { |
所以空字符串(''),false,NULL和0是值相等而类型不一样!
注意:
NULL是一种特殊的类型.
两种情况下为NULL
1. $var = NULL;
2. $var;
3.""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。
总结
从上面实例我们可以看得出null,0,false是假,而''是一个空字符串并不是空值。
在php中static关键字用来修饰属性、方法,称这些属性、方法为静态属性、静态方法,下面我们一直来看看tatic变量与方法学习笔记。static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为“类属性”或“类方法”。
如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号“::”调用。
static关键字可以用来修饰变量、方法。
不经过实例化,就可以直接访问类中static的属性和static的方法。
static 的属性和方法,只能访问static的属性和方法,不能类访问非静态的属性和方法。因为静态属性和方法被创建时,可能还没有任何这个类的实例可以被调用。
static的属性,在内存中只有一份,为所有的实例共用。
使用self:: 关键字访问当前类的静态成员。
静态属性公用特性
一个类的所有实例,共用类中的静态属性。
也就是说,在内存中即使有多个实例,静态的属性也只有一份。
下面例子中的设置了一个计数器$count属性,设置private 和 static 修饰。这样,外界并不能直接访问$count属性。而程序运行的结果我们也看到多个实例在使用同一个静态的$count 属性。
代码如下 | 复制代码 |
<? class user{ private static $count = 0 ; //记录所有用户的登录情况. public function __construct(){ self::$count = self::$count + 1; } public function getCount(){ return self::$count; } public function __destruct(){ self::$count = self::$count -1; } } $user1 = new user(); $user2 = new user(); $user3 = new user(); echo "now here have ".$user1->getCount()." user"; echo "<br>"; unset( $user3); echo "now here have ".$user1->getCount()." user"; ?> |
程序运行结果:
1
2
now here have 3 user
now here have 2 user 111cn.net
静态属性直接调用
静态属性不需要实例化就可以直接使用,在类还没有创建时就可以直接使用。
使用的方式是 类名::静态属性名。
代码如下 | 复制代码 |
|
程序运行结果:
1
2
3
4
半径是 3 的面积是
28.26
半径是 3 的面积是
28.2743338823
类没有创建,静态属性就可以直接使用。那静态属性在什么时候在内存中被创建?在PHP中没有看到相关的资料。引用Java中的概念,来解释应该也具有通用性。
静态属性和方法,在类被调用时创建。类被调用,是指类被创建或者类中的任何静态成员被调用。
静态方法
静态方法不需要所在类被实例化就可以直接使用。
使用的方式是 类名::静态方法名。
下面我们继续写这个Math类,用来进行数学计算。我们设计一个方法用来算出其中的最大值。既然是数学运算,我们也没有必要去实例化这个类,如果这个方法可以拿过来就用就方便多了。
我们这只是为了演示static方法而设计的这个类。www.111Cn.net在PHP提供了 max() 函数比较数值。
代码如下 | 复制代码 |
<? class Math{ public static function Max($num1,$num2){ return $num1 > $num2 ? $num1 : $num2; } } $a = 99; $b = 88; echo "显示 $ a 和 $ b 中的最大值是"; echo "<br>"; echo Math::Max($a,$b); echo "<br>";echo "<br>";echo "<br>"; $a = 99; $b = 100; echo "显示 $ a 和 $ b 中的最大值是"; echo "<br>"; echo Math::Max($a,$b); ?> |
程序运行结果:
显示 $ a 和 $ b 中的最大值是
99
显示 $ a 和 $ b 中的最大值是
100
静态方法如何调用静态方法
第一个例子,一个静态方法调用其它静态方法时,直接使用 类名。
代码如下 | 复制代码 |
<? // 实现最大值比较的Math类。 class Math{ public static function Max($num1,$num2){ return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = Math::Max($num1,$num2); $num2 = Math::Max($num2,$num3); $num1 = Math::Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 88; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?> |
程序运行结果:
1
2
显示 99 77 88 中的最大值是
99
也可以使用self:: 调用当前类中的其它静态方法。(建议)
代码如下 | 复制代码 |
<? // 实现最大值比较的Math类。 class Math{ public static function Max($num1,$num2){ return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = self::Max($num1,$num2); $num2 = self::Max($num2,$num3); $num1 = self::Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 88; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?> |
程序运行结果:
1
2
显示 99 77 88 中的最大值是
99
静态方法调用静态属性 www.111Cn.Net
使用 类名::静态属性名 调用本类中的静态属性。
代码如下 | 复制代码 |
<? // class Circle{ public static $pi = 3.14; public static function circleAcreage($r){ return $r * $r * Circle::$pi; } } $r = 3; echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r); ?> |
程序运行结果:
1
半径 3 的圆的面积是 28.26
使用self:: 调用本类的静态属性。(建议)
代码如下 | 复制代码 |
<? // class Circle{ public static $pi = 3.14; public static function circleAcreage($r){ return $r * $r * self::$pi; } } $r = 3; echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r); ?> |
程序运行结果:
1
半径 3 的圆的面积是 28.26
静态方法不能调用非静态属性
静态方法不能调用非静态的属性。不能使用self::调用非静态属性。
代码如下 | 复制代码 |
<? // class Circle{ public $pi = 3.14; public static function circleAcreage($r){ return $r * $r * self::pi; } } $r = 3; echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r); ?> |
程序运行结果:
1
Fatal error: Undefined class constant 'pi' in E:PHPProjectstest.php on line 7
也不能使用 $this 获取非静态属性的值。
代码如下 | 复制代码 |
|
程序运行结果:
1
Fatal error: Using $this when not in object context in E:PHPProjectstest.php on line 7
静态方法调用非静态方法
PHP5中,在静态方法中不能使用 $this 标识调用非静态方法。
代码如下 | 复制代码 |
<? // 实现最大值比较的Math类。 class Math{ public function Max($num1,$num2){ echo "bad<br>"; return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = $this->Max($num1,$num2); $num2 = $this->Max($num2,$num3); $num1 = $this->Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 188; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?> |
程序运行结果:
显示 99 77 188 中的最大值是
Fatal error: Using $this when not in object context in E:wwW.111cn.neT test.php on line 10
当一个类中有非静态方法被 self:: 调用时,系统会自动将这个方法转换为静态方法。
下面的代码被执行了,而且有结果。因为Max方法被系统转换为静态方法了。
代码如下 | 复制代码 |
<? // 实现最大值比较的Math类。 class Math{ public function Max($num1,$num2){ return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = self::Max($num1,$num2); $num2 = self::Max($num2,$num3); $num1 = self::Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 188; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?> |
程序运行结果:
1
2
显示 99 77 188 中的最大值是
188
下面的例子中,我们让静态方法Max3 用过self::调用了非静态方法Max,有让非静态方法Max通过$this 调用非静态属性 $pi 。
在运行是报出了错误,这个错误和前一个例子 3-1-9.php一样,这次倒是非静态方法Max报出了静态方法调用非静态属性的错误。
这倒是证明了一点,在这里我们定义的非静态方法 Max 被系统自动转换成静态方法了。
代码如下 | 复制代码 |
<? // 实现最大值比较的Math类。 class Math{ public $pi = 3.14; public function Max($num1,$num2){ echo self::$pi; //这里的调用看来不应该有问题. return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = self::Max($num1,$num2); $num2 = self::Max($num2,$num3); $num1 = self::Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 188; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?> |
程序运行结果:
1
2
显示 99 77 188 中的最大值是
Fatal error: Access to undeclared static property: Math::$pi in E:PHPProjectstest.php on line 7
1. 启动memcached
# /usr/local/bin/memcached -d -m 2048 -u root -l 192.168.1.20 -p 12111 -c 1024 -P /tmp/memcached.pid
参数说明:
-d 启动为守护进程
-m <num> 分配给Memcached使用的内存数量,单位是MB,默认为64MB
-u <username> 运行Memcached的用户,仅当作为root运行时
-l <ip_addr> 监听的服务器IP地址,默认为环境变量INDRR_ANY的值
-p <num> 设置Memcached监听的端口,最好是1024以上的端口
-c <num> 设置最大并发连接数,默认为1024
-P <file> 设置保存Memcached的pid文件,与-d选择同时使用
还有一些参数具体请参考:
# /usr/local/bin/memcached -h
2. 结束memcached
# kill /tmp/memcached.pid
如果我们利用textarea提交的数据回车换行与空格都会自动过滤了,所有提交的数据都是没有格式的,下面我们一起来看看解决textarea中回车换行问题。方法一,
代码如下 | 复制代码 |
preg_replace("'([rn])[s]+'", "", $content) //去除回车换行符 |
方法二,
代码如下 | 复制代码 |
str_replace(chr(13),'<br />',$body ) //这样把body中的回车变成了br了。 |
本站原创转载注明来源 www.111cn.net
相关文章
PHP Fatal error: Cannot use object of type stdClass as array in错误
下面一起来看看在php开发中碰到PHP Fatal error: Cannot use object of type stdClass as array in错误问题的解决办法吧。 普通的数组出现如下错误 代码...2016-11-25Spring Data JPA 关键字Exists的用法说明
这篇文章主要介绍了Spring Data JPA 关键字Exists的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-10idea 无法创建Scala class 选项的原因分析及解决办法汇总
这篇文章主要介绍了idea 无法创建Scala class 选项的解决办法汇总,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02浅析Swift中struct与class的区别(汇编角度底层分析)
这篇文章主要介绍了Swift中struct与class的区别 ,本文从汇编角度分析struct与class的区别,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-30- 这篇文章主要介绍了前端JavaScript中的class,类是用于创建对象的模板,JavaScript中的Class更多的还是语法糖,本质上绕不开原型链,下面就来看看关于JavaScript class类的详细内容吧...2021-10-22
- 这篇文章主要介绍了Angular ng-class的知识,并整理了相关资料,有兴趣的小伙伴可以参考下...2016-10-03
- 这篇文章主要介绍了jquery采用oop模式class类的使用方法,结合实例形式分析了jQuery模拟oop模式定义class类与方法的技巧,需要的朋友可以参考下...2016-01-24
- 这篇文章主要给大家介绍了关于Swift中static和class关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-30
MySQL系列理解运用union(all)与limit及exists关键字教程
这篇文章主要为大家介绍了MySQL系列中union(all)、limit及exists关键字的教程示例讲解,通过本篇文章就可以理解MySQL中的这些关键字的概念以及实际的运用...2021-10-26jQuery针对input的class属性写了多个值情况下的选择方法
这篇文章主要介绍了jQuery针对input的class属性写了多个值情况下的选择方法,结合实例形式对比分析了jQuery选择器针对class属性中有多个值情况下的选中方法,需要的朋友可以参考下...2016-06-12PHP中file_exists与is_file,is_dir的区别
在php中file_exists与is_file,is_dir都可以用来检测目录或文件是否存在了,那么它们三者的具体区别在哪里呢,下面我们一起来看看吧。 很显然file_exists是受了asp...2016-11-25AngularJS使用ng-class动态增减class样式的方法示例
这篇文章主要介绍了AngularJS使用ng-class动态增减class样式的方法,结合具体实例形式分析了ng-class操作页面class样式的相关技巧,需要的朋友可以参考下...2017-05-22- 这篇文章主要介绍了C++枚举类型enum与enum class的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-21
php中is_file和file_exists与is_dir的区别
本文章介绍了php中is_file和file_exists与is_dir的区别,有需要的朋友可参考一下。 is_file 只判断文件是否存在; 代码如下 复制代码 <?php...2016-11-25- 这篇文章主要介绍了python metaclass(元类)的相关资料,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-08-14
Django获取model中的字段名和字段的verbose_name方式
这篇文章主要介绍了Django获取model中的字段名和字段的verbose_name方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-20jQuery中attr()与prop()函数用法实例详解(附用法区别)
这篇文章主要介绍了jQuery中attr()与prop()函数用法,结合实例形式详细分析了attr()与prop()函数的使用技巧与相关注意事项,并附带了attr()与prop()函数用法的区别,需要的朋友可以参考下...2016-01-02- 这篇文章主要介绍了React从Class方式转Hooks详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-30
- 在c++Template中,很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?...2020-04-25
IntelliJ IDEA右键文件夹没有Java Class文件的原因及解决方法
这篇文章主要介绍了IntelliJ IDEA右键文件夹没有Java Class文件的原因及解决方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02