PHP中除了有大量的魔术变量外,还有很多_开头的魔术方法,本文简单小结下:
1 _construct 和_destruct就不说了,构造和析构.
2 _call和_callStatic
例子:
<?php
class myClass() {
private $a = true;
}
$myObj = new myClass();
$myObj->showValue();
?>
这里会说出错,那当然的,没定义.可以用
<?php
class Greetings {
function __call( $functionName, $argumentsArray ) {
echo "Hello, " . ucfirst( $functionName ) . " !!!";
}
}
$sayHello = new Greetings();
_CALL会在调用没有定义任何方法时触发
还有_callStatic
<?php
class Greetings {
static function __callStatic( $functionName, $argumentsArray ) {
echo "Hello, " . ucfirst( $functionName ) . " !!!";
}
}
Greetings::steve();
3 _set和_get
这个是强制在类中声明的变量才能被使用,一个例子:
<?php
class myClass {
private $onlyDataMember = 0;
}
$classObj = new myClass();
$classObj->undefinedDataMember = 'Some Value';
echo $classObj->undefinedDataMember;
?>
这个是直接输出了没定义的值,不大好,可以改成这样,强制性地:
<?php
class myClass {
private $onlyDataMember = 0;
function __set( $dataMemberName, $dataMemberValue ) {
throw new Exception( "Object property $dataMemberName is not writable!" );
}
function __get( $dataMemberName ) {
throw new Exception( "Object property $dataMemberName is not defined!" );
}
}
再来一个例子:
class UserInfo2{
private $aData = array();
}
$oUserInfo2 = new UserInfo2;
$oUserInfo2->aData['UserName'] = '木目子';
$oUserInfo2->aData['PassWord'] = '123456';
$oUserInfo2->aData['Birthdat'] = '1978-08-16';
echo "用户名:".$oUserInfo2->aData['UserName'] ."<br/>\n";
echo "密 码:".$oUserInfo2->aData['PassWord'] ."<br/>\n";
echo "生 日:".$oUserInfo2->aData['Birthday'] ."<br/>\n";
显然,这段代码会出错的,因为aData是UserInfo的私有属性,不能直接在外部使用,那现在问题是必须要给aData进行付值,这个时候__set和__get就排上用场了:
class UserInfo3{
//private $aData = array();
private $aData = array();
function __set($property,$value){
$this->aData[$property] = $value;
}
function __get($property){
return $this->aData[$property];
}
}
$oUserInfo3 = new UserInfo3;
$oUserInfo3->aData['UserName'] = '木目子';
$oUserInfo3->aData['PassWord'] = '123456';
$oUserInfo3->aData['Birthdat'] = '1978-08-16';
echo "用户名:".$oUserInfo3->aData['UserName'] ."<br/>\n";
echo "密 码:".$oUserInfo3->aData['PassWord'] ."<br/>\n";
echo "生 日:".$oUserInfo3->aData['Birthday'] ."<br/>\n";
$classObj = new myClass();
$classObj->undefinedDataMember = 'Some Value';
echo $classObj->undefinedDataMember;
?>
这样当调用的时候,就强制报错了
4) _invoke
把对象当函数用,典型的例子为,平常我们一般这样用:
<?php
class myDbUsersClass {
private $recordsArray = array();
function __construct( $fetchThisMuchUsers ) {
// code for fetching $fetchThisMuchUsers number of records from database and store them to $recordsArray.
}
function getUsers() {
return $recordsArray;
}
}
$classObj = new myDbUsersClass( 10 );
$users = $classObj->getUsers();
foreach( $users as $user ) {
echo $user[ 'userName' ] . '<br />';
}
?>
现在可以这样用:
<?php
class myDbUsersClass {
private $recordsArray = array();
function __construct( $fetchThisMuchUsers ) {
// code for fetching $fetchThisMuchUsers number of records from database and store them to $recordsArray.
}
function __invoke( $onlyArgumentItAccepts ) {
return $recordsArray;
}
}
$classObj = new myDbUsersClass( 10 );
foreach( $classObj() as $user ) {
echo $user[ 'userName' ] . '<br />';
}
?>
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com