PHP使用traits实现代码复用的例子

 更新时间:2016年11月25日 15:37  点击:1821
PHP 5.4中的traits,是新引入的特性,用于实现代码重用的方法,下面我们就一起来看看PHP使用traits实现代码复用的例子,希望文章可以帮助到各位.


PHP5.4后新增traits实现代码复用机制,Trait和类相似,但不能被实例化,无需继承,只需要在类中使用关键词use引入即可,可引入多个Traits,用','隔开。
(1)Trait简单使用

<?php
 
trait A {
    public $var1 = 'test1';
    public function test1() {
        echo 'trait A::test1()';
    }
}
 
trait B {
    public $var2 = 'test2';
    public function test2() {
        echo 'trait B::test2()';
    }
}
 
class C {
    use A,B;
}
 
$c = new C();
echo $c->var1; //test1
$c->test2(); //trait B::test2()

(2)优先级问题
Trait会覆盖继承的方法,当前类会覆盖Trait方法。
trait A {
    public $var1 = 'test';
    public function test() {
        echo 'A::test()';
    }
    public function test1() {
        echo 'A::test1()';
    }
}
 
class B {
    public function test() {
        echo 'B::test()';
    }
    public function test1() {
        echo 'B::test1()';
    }
}
class C extends B{
    use A;
    public function test() {
        echo 'c::test()';
    }
}
 
$c = new C();
$c->test(); //c::test()
$c->test1(); //A::test1()

(3)多个Trait冲突问题
如果没有解决冲突,会产生致命错误;
可用insteadof来明确使用冲突中哪一个方法;
可用as操作符将其中一个冲突方法另起名;
trait A {
    public function test() {
        echo 'A::test()';
    }
}
 
trait B {
    public function test() {
        echo 'B::test()';
    }
}
 
class C {
    use A,B {
        B::test insteadof A;
        B::test as t;
    }
}
 
$c = new C();
$c->test(); //B::test()
$c->t(); //B::test()   可以用as另起名

(4)as可用来修改方法访问控制
trait  HelloWorld  {
    public function  sayHello () {
        echo  'Hello World!' ;
    }
}
 
// 修改 sayHello 的访问控制
class  A  {
    use  HelloWorld  {  sayHello  as protected; }
}
 
// 给方法一个改变了访问控制的别名
// 原版 sayHello 的访问控制则没有发生变化
class  B  {
    use  HelloWorld  {  sayHello  as private  myPrivateHello ; }
}
 
$b = new A();
$b->sayHello(); //Fatal error: Call to protected method A::sayHello() from context ''

(5)Trait中使用Trait
trait A {
    public function test1() {
        echo 'test1';
    }
}
 
trait B {
    public function test2() {
        echo 'test2';
    }
}
 
trait C {
    use A,B;
}
 
class D {
    use C;
}
 
$d = new D();
$d->test2();  //test2

(6)Trait支持抽象方法、支持静态方法、不可以直接定义静态变量,但静态变量可被trait方法引用。
trait A {
    public function test1() {
        static $a = 0;
        $a++;
        echo $a;
    }
 
    abstract public function test2(); //可定义抽象方法
}
 
class B {
    use A;
    public function test2() {
 
    }
}
 
$b = new B();
$b->test1(); //1
$b->test1(); //2

(7)Trait可定义属性,但类中不能定义同样名称属性
trait A {
   public $test1;
}
 
class B {
    use A;
    public $test2;
}

接着看

<?php
    trait Drive {
        public $carName = 'trait';
        public function driving() {
            echo "driving {$this->carName}\n";
        }
    }
    class Person {
        public function eat() {
            echo "eat\n";
        }
    }
    class Student extends Person {
        use Drive;
        public function study() {
            echo "study\n";
        }
    }
    $student = new Student();
    $student->study();
    $student->eat();
    $student->driving();
输出结果如下:

study
eat
driving trait
上面的例子中,Student类通过继承Person,有了eat方法,通过组合Drive,有了driving方法和属性carName。

如果Trait、基类和本类中都存在某个同名的属性或者方法,最终会保留哪一个呢?通过下面的代码测试一下:

<?php
    trait Drive {
        public function hello() {
            echo "hello drive\n";
        }
        public function driving() {
            echo "driving from drive\n";
        }
    }
    class Person {
        public function hello() {
            echo "hello person\n";
        }
        public function driving() {
            echo "driving from person\n";
        }
    }
    class Student extends Person {
        use Drive;
        public function hello() {
            echo "hello student\n";
        }
    }
    $student = new Student();
    $student->hello();
    $student->driving();
输出结果如下:

hello student
driving from drive
因此得出结论:当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,而 trait 的方法又覆盖了基类中的方法。

如果要组合多个Trait,通过逗号分隔 Trait名称:

use Trait1, Trait2;
如果多个Trait中包含同名方法或者属性时,会怎样呢?答案是当组合的多个Trait包含同名属性或者方法时,需要明确声明解决冲突,否则会产生一个致命错误。

<?php
trait Trait1 {
    public function hello() {
        echo "Trait1::hello\n";
    }
    public function hi() {
        echo "Trait1::hi\n";
    }
}
trait Trait2 {
    public function hello() {
        echo "Trait2::hello\n";
    }
    public function hi() {
        echo "Trait2::hi\n";
    }
}
class Class1 {
    use Trait1, Trait2;
}
输出结果如下:

PHP Fatal error:  Trait method hello has not been applied, because there are collisions with other trait methods on Class1 in ~/php54/trait_3.php on line 20
使用insteadof和as操作符来解决冲突,insteadof是使用某个方法替代另一个,而as是给方法取一个别名,具体用法请看代码:

<?php
trait Trait1 {
    public function hello() {
        echo "Trait1::hello\n";
    }
    public function hi() {
        echo "Trait1::hi\n";
    }
}
trait Trait2 {
    public function hello() {
        echo "Trait2::hello\n";
    }
    public function hi() {
        echo "Trait2::hi\n";
    }
}
class Class1 {
    use Trait1, Trait2 {
        Trait2::hello insteadof Trait1;
        Trait1::hi insteadof Trait2;
    }
}
class Class2 {
    use Trait1, Trait2 {
        Trait2::hello insteadof Trait1;
        Trait1::hi insteadof Trait2;
        Trait2::hi as hei;
        Trait1::hello as hehe;
    }
}
$Obj1 = new Class1();
$Obj1->hello();
$Obj1->hi();
echo "\n";
$Obj2 = new Class2();
$Obj2->hello();
$Obj2->hi();
$Obj2->hei();
$Obj2->hehe();
输出结果如下:

Trait2::hello
Trait1::hi

Trait2::hello
Trait1::hi
Trait2::hi
Trait1::hello
as关键词还有另外一个用途,那就是修改方法的访问控制:

<?php
    trait Hello {
        public function hello() {
            echo "hello,trait\n";
        }
    }
    class Class1 {
        use Hello {
            hello as protected;
        }
    }
    class Class2 {
        use Hello {
            Hello::hello as private hi;
        }
    }
    $Obj1 = new Class1();
    $Obj1->hello(); # 报致命错误,因为hello方法被修改成受保护的
    $Obj2 = new Class2();
    $Obj2->hello(); # 原来的hello方法仍然是公共的
    $Obj2->hi();  # 报致命错误,因为别名hi方法被修改成私有的
Trait 也能组合Trait,Trait中支持抽象方法、静态属性及静态方法,测试代码如下:

<?php
trait Hello {
    public function sayHello() {
        echo "Hello\n";
    }
}
trait World {
    use Hello;
    public function sayWorld() {
        echo "World\n";
    }
    abstract public function getWorld();
    public function inc() {
        static $c = 0;
        $c = $c + 1;
        echo "$c\n";
    }
    public static function doSomething() {
        echo "Doing something\n";
    }
}
class HelloWorld {
    use World;
    public function getWorld() {
        return 'get World';
    }
}
$Obj = new HelloWorld();
$Obj->sayHello();
$Obj->sayWorld();
echo $Obj->getWorld() . "\n";
HelloWorld::doSomething();
$Obj->inc();
$Obj->inc();
输出结果如下:

Hello
World
get World
Doing something
1
2

下面来给各位介绍一个利用Typecho解决Gravatar被墙的问题,因为现在google与一些国外网站打不开所以也导致了Gravatar头像无法显示了,下面来看此问题的解决办法.

前两天Gravatar突然被墙,本来也没怎么在意,但是网站速度被拖得实在是难以忍受的地步,无奈,只好想一下解决方法,于是昨晚睡觉前百度了下,发现那些解决方案都是Wordpress的,例如@大发最新的解决方案:

function get_ssl_avatar($avatar) {
   $avatar = preg_replace('/.*\/avatar\/(.*)\?s=([\d]+)&.*/','<img src="https://secure.gravatar.com/avatar/$1?s=$2" class="avatar avatar-$2" height="$2" width="$2">',$avatar);
   return $avatar;
}
add_filter('get_avatar', 'get_ssl_avatar');

但是Typecho并没有相关的文档,本想把大发的代码修改到TE,但是我不会PHP,看了好半天,翻了下程序源文件,怎么改都不行,于是我只好苦逼的修改源文件去了,希望好基友们看到后帮我鼓捣下。
好了,修改源文件其实也超级简单,只需要一行就可以了,方法如下:
打开 \var\Widget\Abstract\Comments.php 文件
在第413行找到“$url = $host . '/avatar/';”
修改为如下

        //$url = $host . '/avatar/';
        $url = 'https://secure.gravatar.com/avatar/';

然后保存就行了,就是把上面那个注释掉然后手动加一个链接。
最新版(1.0-14.10.10)的解决方法,同样是打开Comments.php,第397行,将下方代码:

$url = Typecho_Common::gravatarUrl($this->mail, $size, $rating, $default, $this->request->isSecure());
修改为:
$mailHash = NULL;
if (!empty($this->mail)) {
$mailHash = md5(strtolower($this->mail));
}
$url = 'https://secure.gravatar.com/avatar/';
if (!empty($this->mail)) {$url .= $mailHash;}
$url .= '?s=' . $size;
$url .= '&amp;r=' . $rating;
$url .= '&amp;d=' . $default;
//$url = Typecho_Common::gravatarUrl($this->mail, $size, $rating, $default, $this->request->isSecure());
“https://secure.gravatar.com”可以改成其它源。

多说的源:http://gravatar.duoshuo.com
七牛镜像源:http://avacdn.qiniudn.com
七牛镜像SSH源:https://dn-avacdn.qbox.me

当然自己搭建七牛镜像,或者反向代理Gravatar也是比较简单的,就不再赘述。
另外,如果你正在使用“评论墙”功能,那么可以在插件或者主题的function.php中找到如下代

$mostactive .= '<img class="avatar" src="http://'.$my_array[rand(0,3)].'.gravatar.com/avatar/'.md5(strtolower($value['mail'])).'?s=40&d=&r=G"/></a></li>';
将其修改为如下:

//$mostactive .= '<img class="avatar" src="http://'.$my_array[rand(0,3)].'.gravatar.com/avatar/'.md5(strtolower($value['mail'])).'?s=40&d=&r=G"/></a></li>';
$mostactive .= '<img class="avatar" src="https://secure.gravatar.com/avatar/'.md5(strtolower($value['mail'])).'?s=40&d=&r=G"/></a></li>';


同样是将默认的注视,然后修改,源地址参考上面的自行修改即可。
另外,我的Wordpress的主题从GoodNice版本后就支持在设置中修改avatar的源了,方法如下:

设置头像源

 

方法二

将下方代码粘贴进入主题文件夹下的function.php内:

//自定义评论列表区域
function threadedComments($comments, $options) {
    $commentClass = '';
    if ($comments->authorId) {
        if ($comments->authorId == $comments->ownerId) {
            $commentClass .= ' comment-by-author';
        } else {
            $commentClass .= ' comment-by-user';
        }
    }
 
    $commentLevelClass = $comments->levels > 0 ? ' comment-child' : ' comment-parent';
?>
 
<li id="li-<?php $comments->theId(); ?>" class="comment-body<?php
if ($comments->levels > 0) {
    echo ' comment-child';
    $comments->levelsAlt(' comment-level-odd', ' comment-level-even');
} else {
    echo ' comment-parent';
}
$comments->alt(' comment-odd', ' comment-even');
echo $commentClass;
?>">
    <div id="<?php $comments->theId(); ?>">
        <div class="comment-author">
            <?php
            //头像CDN by Rich
            $host = 'https://secure.gravatar.com'; //自定义头像CDN服务器
            $url = '/avatar/'; //自定义头像目录,一般保持默认即可
            $size = '32'; //自定义头像大小
            $rating = Helper::options()->commentsAvatarRating;
            $hash = md5(strtolower($comments->mail));
            $avatar = $host . $url . $hash . '?s=' . $size . '&r=' . $rating . '&d=';
            ?>
            <img class="avatar" src="<?php echo $avatar ?>" alt="<?php echo $comments->author; ?>" width="<?php echo $size ?>" height="<?php echo $size ?>" />
            <cite class="fn"><?php $comments->author(); ?></cite>
        </div>
        <div class="comment-meta">
            <a href="<?php $comments->permalink(); ?>"><?php $comments->date('Y-m-d H:i'); ?></a>
            <span class="comment-reply"><?php $comments->reply(); ?></span>
        </div>
        <?php $comments->content(); ?>
    </div>
<?php if ($comments->children) { ?>
    <div class="comment-children">
        <?php $comments->threadedComments($options); ?>
    </div>
<?php } ?>
</li>
<? }

OK,评论区域的头像问题就可以更简单的解决了,更新程序也不用重新修改源文件

浮点数就是有很我小数的那种并且不只单纯了数字了,而小编在用支付接口时就碰到浮点数丢失的问题,下文一起来看看问题解决方法.


先看下面这段代码:

$f = 0.57;
echo intval($f * 100);  //56

结果可能有点出乎你的意外,PHP遵循IEEE 754双精度:
浮点数, 以64位的双精度, 采用1位符号位(E), 11指数位(Q), 52位尾数(M)表示(一共64位).
符号位:最高位表示数据的正负,0表示正数,1表示负数。
指数位:表示数据以2为底的幂,指数采用偏移码表示
尾数:表示数据小数点后的有效数字.

再来看看小数用二进制怎么表示:

乘2取整,顺序排列,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分,但是像0.57这样的小数像这样一直乘下去,小数部分不可能为0.有效位的小数用二进制表示却是无穷的。

0.57的二进制表示基本上(52位)是: 0010001111010111000010100011110101110000101000111101

如果只有52位的话,0.57 =》 0.56999999999999995

不难看出上面意外的结果了吧,再补充一下例子

办法有很多,这里列举两个:

1. sprintf

substr(sprintf("%.10f", ($a/ $b)), 0, -7);
2. round (注意会进行四舍五入)

round($a/$b, 3);

对于精度我一直理解为小数点后保留多少,那么在php的浮点数中是这样的么?答案是否定的。

浮点数其实是整数部分和小数部分组成,这里的精度是指整数部分的位数加小数部分的位数不能超过其精度最大值,如果超过,则按照四舍五入的方法截断到最大的精度值。整数部分如果是0,则不计位数,小数部分末尾0也不计入位数。另外对于同一个数,precision的不同,可能显示的出来表现形式也不一样。下面通过例子的方式来说明。

整数部分为 0 情况

 $num = 0.12345600000000000;
 //整数部分为0 ,位数为 0 ,小数部分末尾的 0 不计入位数,所以总位数为 6

 ini_set("precision", "12");
 echo $num; // 0.123456
 //未超过精度值,显示的结果为 0.123456

 ini_set("precision", "3");
 echo $num; // 0.123
 //超过精度值,保留3位

 ini_set("precision", "5");
 echo $num; // 0.12346
 //超过精度值,保留5位
这种情况下,精度值等价于小数点后保留几位。

整数部分大于 0 情况

 $num = 12.12345600000000000;
 //整数部分为12 ,位数为 2 ,小数部分末尾的 0 不计入位数,位数为6,所以总位数为 2 + 6

 ini_set("precision", "12");
 echo $num; // 12.123456
 //未超过精度值,显示的结果为 12.123456

 ini_set("precision", "3");
 echo $num; // 12.1
 //超过精度值,整数部分位数为 2 ,所以只保留一位小数

 ini_set("precision", "5");
 echo $num; // 12.123
 //超过精度值,整数部分位数为 2 ,所以只保留3位小数
可以看到小数点后保留的位数跟精度已经整数部分的位数有关。

整数部分大于 0 情况 之二

 $num = 12345678.12345600000000000;
 //整数部分为12345678 ,位数为 8 ,小数部分末尾的 0 不计入位数,位数为6,所以总位数为 8 + 6

 ini_set("precision", "12");
 echo $num; // 12345678.1235
 //超过精度值,显示的结果为 12345678.1235

 ini_set("precision", "3");
 echo $num; // 1.23E+7
 //超过精度值,且整数部分位数超过精度,小数部分舍弃,且整数部分只取3位

 ini_set("precision", "5");
 echo $num; // 12346000
 //超过精度值,且整数部分位数超过精度,小数部分舍弃,且整数部分只取5位
上述例子中可以看到,精度值也关系到整数部分的截取。注意到最后两个例子中显示的方式不一样,一个是使用科学计数法,一个是后面用 0 补。通过实验得出的结论是当整数部分的位数 减去 精度值 大于 4 的时候,使用科学计数法的方式,否则后面用 0 补,换句话说,就是整数部分位数超过精度值后,截断后,补 0 的个数不会超过 4 。

浮点数运算

 $num1 = 1331625729.687;
 $num2 = 1331625730.934;
 ini_set("precision", "8");

 echo $num1 . '
';
 echo $num2 . '
';

 $sub = $num1 - $num2;

 echo $sub . '
';
//输出的结果为:
/*
 1331625700
 1331625700
 -1.247
*/
上述例子就说明了精度值只是控制显示结果,内部存储还是原始值,所以 $sub 的值为1331625729.687减1331625730.934。

通常情况下我们用户可以多个人同时登录了,但有时客户需求我们需要的是同一个账号同时只能一个人登录了,下面我们就一起来看此问题的解决办法.

以前考虑过这个问题,今天实现了一下,挺快的,从研究到开发完成差不多4个小时。有点类似QQ,二台电脑登录,一台会把另一台挤掉线,并提示其他地点登录信息。

一,实现原理

1,用户在电脑A登录,session信息存放在redis当中,并将session_id存到mysql数据库中。
2,同一用户在电脑B登录,验证完用户名和密码后,将该用户信息从数据库读出,取得用户在电脑A登录的session_id,然后在到redis中验证session是否过期。
3,如果过期,不用openfire推送提示信息。如果没有过期,php利用openfire推送消息后,在将redis中用户在电脑A中登录的session删除掉,删除后,在将用户在电脑B登录的个人信息放到session中,并将电脑B登录的session_id更新到数据库中,在这里一定要先发送推送,然后在清空session,不然用户在电脑A收不到xmpp发过来的消息。

注意:

openfire是java cms的一种,自身有数据库,您创建的用户表根openfire自带的用户表之间要建立某种联系(如:手机号,邮箱等),方便信息推送。
同一session_id肯定是在相同媒介上登录的,这个时候,也不用更新数据库和推送消息
下面简单说一下安装过程,以及要注意的地方。

二,安装所用到的工具

# yum install php php-fpm nginx mysql mysql-server redis php-redis php-devel php-pdo php-mysql 

修改session存储方式:

# vim /etc/php-fpm.d/www.conf    
 
;php_value[session.save_handler] = files   //注释掉旧的 
;php_value[session.save_path] = /var/lib/php/session 
 
php_value[session.save_handler] = redis  //添加以下内容 
php_value[session.save_path] = "tcp://127.0.0.1:6379" 

启动服务后,如果以下内容说明,session存redis成功了

redis telnet查看session
redis telnet查看session

openfire下载地址:http://www.igniterealtime.org/downloads/

# rpm -ivh ./*.rpm   //下载的是rpm安装包 

openfire启动后,然后访问http://ip:9090,一步一步配置就成了,有一点要注意就是数据库的编码。

PDO是高版本php中的一个mysql数据库操作功能了,我们下面就一起来看看关于php中PDO的一些学习笔记,有兴趣了解PDO的朋友可一起来看看哦.

一、PDO简介

  PDO是PHP Data Object的简称,用于定义数据库访问的抽象层,统一各种数据库的访问接口。PDO有如下特性:

编码一致性:PDO支持多种数据库扩展,并为其提供统一的访问接口
灵活性:PDO提供了统一的SQL操作方法和属性
高效性:PDO是用C编写、PHP编译的
面向对象:PDO完全采纳面向对象的思想
  PDO支持的数据库:

pdo支持的数据库

  但是,需要注意的是,PDO只是提供了一组数据库访问接口,利用PDO本身不能操作任何数据库。

二、PDO对象

  利用PDO的构造函数连接特定的数据库,创建一个PDO对象。在利用PDO之前,需要开启PDO扩展。以PHP+MySQL为例,

  开启PHP对PDO的扩展:在php.ini中去掉extension=php_pdo.dll的注释。

  开启MySQL对PDO的扩展:在my.ini中去掉extension=php_pdo_mysql.dll的注释。

  利用phpinfo()可以查看是否开启PDO扩展。

  1、连接数据库

    PDO连接数据库有三种方式:

   1.1  通过参数形式连接(推荐)

$dsn = "mysql:host=localhost;dbname=xxx";
$username = "xxxxx";
$pwd = "xxxx";
$pdo = new PDO($dsn,$username,$pwd);
  PDO构造函数还有一个$options参数,它是一个数组,用于配置运行中的数据库,如是否开启自动提交、设置结果集的返回方式等。

  1.2  通过uri连接

  首先建立一个文件,保存数据源,文件内容形如:mysql:host=localhost;dbname=xxx。然后在程序中引入该文件。

$dsn = "uri:file://保存数据源配置的文件路径";
$username = "xxxxx";
$pwd = "xxxx";
$pdo = new PDO($dsn,$username,$pwd);
  1.3  通过配置文件连接

  在php.ini中的任意一个位置添加数据源的配置:

        pdo.dsn.test=”mysql:host=localhost;dbname=xxxx”;

  test是自定义的数据源名称。为方便,可以在php.ini的首行中添加,然后重启服务器,在程序中引入该数据源

$dsn = "test";    //数据源名称
$username = "xxxxx";
$pwd = "xxxx";
$pdo = new PDO($dsn,$username,$pwd);
  2、PDO对象的常见方法和属性

方法或属性 描述
exec() 执行一条SQL语句,返回受影响的行数。用于增删改,对查询返回0
query() 执行一条SQL语句,返回PDOStatement对象,用于保存结果集
prepare() 执行一条SQL语句,返回PDOStatement对象
quote() 返回一个添加引号的字符串,用于SQL语句,可防止SQL注入
lastInsertId 返回最后插入的ID
setAttribute() 设置数据库连接属性
getAttribute() 获取数据库连接属性
errorCode() 获取跟数据库句柄上一次操作相关的SQLSTATE
errorInfo() 获取跟数据库句柄上一次操作相关的错误信息
beginTransaction() 开启一个事务。需要先关闭自动提交
commit() 提交事务
rollBack() 回滚事务
inTransaction() 检查操作是否在事务内
 

三、PDOStatement对象

  PDO对象的query()和prepare()方法均会返回一个PDOStatement对象,该对象可以用于PDO的预处理执行。其常见方法如下:

方法 描述
execute() 执行一条预处理语句
rowCount() 返回上一个SQL语句影响的行数
fetch() 从结果集中获取一行
fetchAll() 返回一个包含结果中所有行的数组
setFetchMode() 设置默认获取结果集的模式
fetchObject() 获取结果集下一行并作为对象返回
fetchColumn() 获取结果集下一行的单独一列
bindParam() 绑定一个参数到指定的变量名
bindValue() 将某个值绑定到指定的参数
bindColumn() 绑定一列到PHP变量
getColumnMeta() 返回结果集中一列的元素据
columnCount() 返回结果中的列数
setAttribute() 设置一个语句属性
getAttribute() 获取一个语句属性
errorCode() 获取跟数据库句柄上一次操作相关的SQLSTATE
errorInfo() 获取跟数据库句柄上一次操作相关的错误信息
debugDumpparams() 打印一条SQL预处理语句
nextRowset() 在一个多行集语句句柄中推进到下一个行集
 

四、异常模式

 PDO支持三种异常模式:

默认模式:PDO::ERRMODE_CLIENT
警告模式:PDO::ERRMODE_WARNING
异常模式:PDO::ERRMODE_EXCEPTION(推荐)
  可以在PDO的构造函数的第四个$options参数或用PDO对象的setAttribute()方法设置。

[!--infotagslink--]

相关文章

  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • php语言实现redis的客户端

    php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
  • jQuery+jRange实现滑动选取数值范围特效

    有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   view-source:http://...2016-09-20
  • php 调用goolge地图代码

    <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
  • JS基于Mootools实现的个性菜单效果代码

    本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
  • JS实现的简洁纵向滑动菜单(滑动门)效果

    本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • php 取除连续空格与换行代码

    php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • PHP实现清除wordpress里恶意代码

    公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 如何使用php脚本给html中引用的js和css路径打上版本号

    在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24
  • js识别uc浏览器的代码

    其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
  • JS实现双击屏幕滚动效果代码

    本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30