PHP中__set 与 __get使用示例,有需要的朋友可以参考下。
官方说明
public void __set ( string $name , mixed $value )
public mixed __get ( string $name )
public bool __isset() ( string $name )
public void __unset ( string $name )
在给未定义的变量赋值时,__set() 会被调用。
读取未定义的变量的值时,__get() 会被调用。
当对未定义的变量调用 isset() 或 empty()时,__isset() 会被调用。
当对未定义的变量调用 unset()时,__unset() 会被调用。
参数$name是指要操作的变量名称。__set() 方法的$value 参数指定了$name变量的值。
属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为static。 从PHP 5.3.0起, 将这些魔术方法定义为static会产生一个警告。
演示代码1:
<?php
class Person {
function __get( $property ) {
$method = "get{$property}";
if ( method_exists( $this, $method ) ) {
return $this->$method();
}
}
function __isset( $property ) {
$method = "get{$property}";
return ( method_exists( $this, $method ) );
}
function getName() {
return "Bob";
}
function getAge() {
return 44;
}
}
print "<pre>";
$p = new Person();
if ( isset( $p->name ) ) {
print $p->name;
} else {
print "nope\n";
}
print "</pre>";
// output:
// Bob
?>
演示代码2:
<?php
class Person {
private $_name;
private $_age;
function __set( $property, $value ) {
$method = "set{$property}";
if ( method_exists( $this, $method ) ) {
return $this->$method( $value );
}
}
function __unset( $property ) {
$method = "set{$property}";
if ( method_exists( $this, $method ) ) {
$this->$method( null );
}
}
function setName( $name ) {
$this->_name = $name;
if ( ! is_null( $name ) ) {
$this->_name = strtoupper()($this->_name);
}
}
function setAge( $age ) {
$this->_age = $age;
}
}
print "<pre>";
$p = new Person();
$p->name = "bob";
$p->age = 44;
print_r( $p );
unset($p->name);
print_r( $p );
print "</pre>";
?>
输出结果:
Person Object
(
[_name:Person:private] => BOB
[_age:Person:private] => 44
)
Person Object
(
[_name:Person:private] =>
[_age:Person:private] => 44
)
php将地区分类排序的算法介绍,有需要的朋友可以参考下。
写一个函数,用来存储地区数据:
$array = array(
0=>array("","河北"),
1=>array("","北京"),
2=>array(0,"保定"),
3=>array(1,"海淀"),
4=>array(3,"中关村"),
5=>array(2,"涿州")
);
?>
处理后返回如下结果:
河北
-保定
--涿州
北京
-海淀
--中关村
算法代码:
function typeArray($array){
$con = null;
foreach ($array as $k=>$v){
$na[$k] = is_numeric($v[0]) ? $na[$v[0]].$k."|" : $k."|";
}
asort($na); //排序
foreach ($na as $k=>$v){
$s = substr_count($v,"|");
$con .= str_repeat("-",($s-1)).$array[$k][1]."\n";
}
return $con;
}
?>
需求是这样的:从log日志中找到访问小图最多的前三个ip地址。
日志文件:20121030.log,内容如下:
0 192.168.1.102 small_0.gif
1 192.168.1.113 big_1.gif
2 192.168.1.110 small_2.gif
3 192.168.1.114 small_3.gif
4 192.168.1.118 small_4.gif
5 192.168.1.109 big_5.gif
6 192.168.1.110 small_6.gif
7 192.168.1.102 small_7.gif
8 192.168.1.110 small_8.gif
9 192.168.1.119 big_9.gif
10 192.168.1.112 small_10.gif
。。。中间省略。。。
91 192.168.1.112 small_91.gif
92 192.168.1.112 small_92.gif
93 192.168.1.108 small_93.gif
94 192.168.1.105 big_94.gif
95 192.168.1.117 big_95.gif
96 192.168.1.119 big_96.gif
97 192.168.1.105 big_97.gif
98 192.168.1.120 small_98.gif
99 192.168.1.114 small_99.gif
程序代码:
function topIp($logfile,$length=3){
$handle = fopen($logfile, 'r');
$countip = array();//统计ip
if ($handle) {
while ($buffer = fgets($handle)) {//逐行读取文件
$arr = preg_split('/\t/',$buffer);
if(strstr($arr[2],"small")){//小图
//ip为键,出现次数为指
$countip[$arr[1]] = $countip[$arr[1]] ? ++$countip[$arr[1]] : 1;
}
}
fclose($handle);
arsort($countip);//ip出现次数倒序
return array_slice($countip,0,$length);//提取
}
}
$topips = topIp('20121030.log',3);
var_dump($topips);
?>
输出的结果:
array(3) { ["192.168.1.110"]=> int(10) ["192.168.1.108"]=> int(8) ["192.168.1.120"]=> int(7) }