Php中钩子(Hook)的应用例子

 更新时间:2016年11月25日 15:30  点击:1967
Hook在php中叫做钩子了,今天我们就一起来看看关于Php中钩子(Hook)的应用例子,希望这篇文章能够给各位带来帮助.

我们先来回顾下原本的开发流程;
产品汪搞出了一堆需求;
当用户注册成功后需要发送短信、发送邮件等等;
然后聪明机智勇敢的程序猿们就一扑而上;
把这些需求转换成代码扔在 用户注册成功 和 跳转到首页 之间;

没有什么能够阻挡;充满创造力的猿们;

<?php
 class Test{
 public function index(){
 // 用户注册成功
 /*
此处是一堆发送短信的代码
*/
 /*
此处是一堆发送邮件的代码
*/
 /*
此处是一堆其他功能的代码
*/
 // 前往网站首页
 }
}
$test=new Test();
$test->index();
如果每个功能都由不同的猿完成的话;
首先面临的就是代码会很杂乱;配合起来会比较麻烦;
那封装成函数吧;一方面会规范整洁写;另外方便重复调用;

没有什么能够阻挡;充满创造力的猿们;

<?php
class Test{
 public function index(){
 // 用户注册成功
 // 发送短信
sendSms($phone);
 // 发送邮件
sendSms($email);
 // 其他操作...
 // 前往网站首页
 }
}
/**
* 发送短信通知
* @param integer $phone 手机号
*/
function sendSMS($phone){
 // 此处是发送短信的代码
}
/**
* 发送邮件通知
* @param string $email 邮箱地址
*/
function sendEmail($email){
 // 此处是发送邮件的代码
}
这时候运营喵表示;
如果能在后台点点按钮就能设置是发邮件还是发短信;那想必是极好的;

没有什么能够阻挡;充满创造力的猿们;

<?php
class Test{
 public function index(){
 // 用户注册成功
 if ('如果设置了发送短信') {
 // 发送短信
sendSms($phone);
 }
 if ('如果设置了发送邮件') {
 // 发送邮件
sendSms($email);
 }
 // 其他操作...
 // 前往网站首页
 }
}
/**
* 发送短信通知
* @param integer $phone 手机号
*/
function sendSMS($phone){
 // 此处是发送短信的代码
}
/**
* 发送邮件通知
* @param string $email 邮箱地址
*/
function sendEmail($email){
 // 此处是发送邮件的代码
}

在一个封闭企业环境下这样搞是没有问题的;
然鹅;我们还有一位开放无私的猿领导要把程序开源出去造福其他猿类;
希望有更多的猿类来参与这个项目;共同开发功能;
如果大家都去改动这套程序;把自己的代码扔在 用户注册成功 和 跳转到首页 之间;
这显然是不靠谱的;想想都混乱的一塌糊涂;

那可不可以大家把自己写的代码放到某个目录下;
然后系统自动的根据配置项把这些代码加载到 用户注册成功 和 跳转到首页 之间呢?
好先定义如下目录

├─plugin // 插件目录
│ ├─plugin1 // 插件1
│ │ ├─config.php // 插件1的配置项
│ │ ├─index.php // 插件1的程序处理内容
│ ├─plugin2
│ │ ├─config.php
│ │ ├─index.php
│ ├─plugin3
│ │ ├─config.php
│ │ ├─index.php
│ ├─...
├─index.php // 业务逻辑

业务逻辑的代码

<?php
class Test{
 public function index(){
 // 用户注册成功
 // 获取全部插件
$pluginList=scandir('./plugin/');
 // 循环插件 // 排除. ..
 foreach ($pluginList as $k => $v) {
 if ($v=='.' || $v=='..') {
unset($pluginList[$k]);
 }
 }
echo "简易后台管理<hr>";
 // 插件管理
 foreach ($pluginList as $k => $v) {
 // 获取配置项
$config=include './plugin/'.$v.'/config.php';
$word=$config['status']==1 ? '点击关闭' : '点击开启';
echo $config['title'].'<a href="./index.php?change='.$v.'">'.$word.'</a><br />';
 }
echo '<hr>';
 // 输出插件内容
 foreach ($pluginList as $k => $v) {
 // 获取配置项
$config=include './plugin/'.$v.'/config.php';
 if ($config['status']==1) {
include './plugin/'.$v.'/index.php';
 // 运行插件
 Hook::run($v);
 }
 }
 // 前往网站首页
 }
}
// 插件类
class Hook{
 // 注册添加插件
 public static function add($name,$func){
$GLOBALS['hookList'][$name][]=$func;
 }
 // 执行插件
 public static function run($name,$params=null){
 foreach ($GLOBALS['hookList'][$name] as $k => $v) {
call_user_func($v,$params);
 }
 }
}
// 更改插件状态
if (isset($_GET['change'])) {
 // 获取到配置项
$config=include './plugin/plugin'.substr($_GET['change'],-1).'/config.php';
 // 如果是开启 那就关闭 如果是关闭 则开启
$config['status']=$config['status']==1 ? 0: 1;
 // 将更改后的配置项写入到文件中
$str="<?php \r\n return ".var_export($config,true).';';
file_put_contents('./plugin/'.$_GET['change'].'/config.php', $str);
header('Location:./');
}
$test=new Test();
$test->index();

插件配置项代码:

<?php
 return array (
 'status' => 1, // 定义状态 1表示开启 0表示关闭
 'title' => '发送短信', // 插件的名称
);

插件的内容:

<?php
Hook::add('plugin1',function(){
echo '发送短信的内容<br />';
});

今天我们来看一篇关于Windows下命令行下执行Php程序的例子,希望这篇文章能够给各位带来帮助,具体的细节步骤如下文介绍.

在windows的命令行下执行程序

打开 命令提示符 cmd.exe

 

 

切换到PHP安装目录,如图:E:

进入相应的目录,如图:cd \np\php

执行PHP文件:php.exe E:\www\test.php

substr不是字符截取吗怎么可以判断字符串位置呢,今天我们就来看一篇关于PHP substr 返回字符串的子串的例子,希望文章对各位有帮助.

substr
(PHP 4, PHP 5)

substr — 返回字符串的子串

说明
string substr ( string $string , int $start [, int $length ] )
返回字符串 string 由 start 和 length 参数指定的子字符串。

参数


string

输入字符串。

start

如果 start 是非负数,返回的字符串将从 string 的 start 位置开始,从 0 开始计算。例如,在字符串 “abcdef” 中,在位置 0 的字符是 “a”,位置 2 的字符串是 “c” 等等。

如果 start 是负数,返回的字符串将从 string 结尾处向前数第 start 个字符开始。

如果 string 的长度小于或等于 start,将返回 FALSE。


Example #1 使用负数 start

<?php
$rest = substr("abcdef", -1);    // 返回 "f"
$rest = substr("abcdef", -2);    // 返回 "ef"
$rest = substr("abcdef", -3, 1); // 返回 "d"
?>

 

length

如果提供了正数的 length,返回的字符串将从 start 处开始最多包括 length 个字符(取决于string 的长度)。

如果提供了负数的 length,那么 string 末尾处的许多字符将会被漏掉(若 start 是负数则从字符串尾部算起)。如果 start 不在这段文本中,那么将返回一个空字符串。

如果提供了值为 0,FALSE 或 NULL 的 length,那么将返回一个空字符串。

如果没有提供 length,返回的子字符串将从 start 位置开始直到字符串结尾。


Example #2 使用负数 length

<?php
$rest = substr("abcdef", 0, -1);  // 返回 "abcde"
$rest = substr("abcdef", 2, -1);  // 返回 "cde"
$rest = substr("abcdef", 4, -4);  // 返回 ""
$rest = substr("abcdef", -3, -1); // 返回 "de"
?>


返回值
返回提取的子字符串, 或者在失败时返回 FALSE。

范例

Example #3 substr() 基本用法

<?php
echo substr('abcdef', 1);     // bcdef
echo substr('abcdef', 1, 3);  // bcd
echo substr('abcdef', 0, 4);  // abcd
echo substr('abcdef', 0, 8);  // abcdef
echo substr('abcdef', -1, 1); // f

// 访问字符串中的单个字符
// 也可以使用中括号
$string = 'abcdef';
echo $string[0];                 // a
echo $string[3];                 // d
echo $string[strlen($string)-1]; // f
?>


错误/异常
错误时返回 FALSE。 <?php
var_dump(substr('a', 1)); // bool(false)
?>

php mt_rand()随机数函数可以随便生成我们设置的数字了,这个我们下面给各位整理了关于php mt_rand()随机数函数用法的例子.

mt_rand() 使用 mersenne twister 算法返回随机整数.

语法:mt_rand(min,max)

说明:如果没有提供可选参数 min 和 max,mt_rand() 返回 0 到 rand_max 之间的伪随机数,例如想要 5 到 15(包括 5 和 15)之间的随机数,用 mt_rand(5,15).
在 3.0.7 之前的版本中,max 的含义是 range,要在这些版本中得到和上例相同 5 到 15 的随机数,简短的例子是 mt_rand (5, 11).
PHP实例代码如下:

$rand = mt_rand(0,1);

if( $rand==0 )

{

 $array = array(41,20,26,29,30);

}

elseif( $rand==1 )

{

 $array = array(38,42,37,400,444);

}//开源软件:phpfensi.com

foreach( $array as $v => $vv )

{

 echo "$vvn";

}

利用时间和mt_rand函数获取随机名字

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/9/19 0019
 * Time: 19:47
 */
function rdname(){
    $t = getdate();
    $year=$t['year'];
    $month = $t['mon']<10? "0".$t['mon']:$t['mon'];
    $day = $t['mday']>9?$t['mday']:"0".$t['mday'];
    $hour= $t['hours']>9?$t['hours']:"0".$t['hours'];
    $min = $t['minutes']>9?$t['minutes']:"0".$t['minutes'];
    $sec = $t['seconds']>9?$t['seconds']:"0".$t['seconds'];
    $randnum=mt_rand(1000,9999);//获取随机的4个数字
    $randname=$year.$month.$day.$hour.$min.$sec.$randnum;//把年月日时分和随机数拼接起来
   return $randname;//返回新的名字
}
$newname=rdname();//把返回的名字赋值给$newname
echo $newname; ?>

 

下面我们在这里来为各位介绍一篇关于php curl file_get_contents post方式获取数据例子,希望文章能够帮助到各位朋友.

curl post,file_get_contents post,curl file_get_contents post请求数据

在PHP中cURL、file_get_contents函数均可以获取远程链接的数据,但是file_get_contents的可控制性不太好,对于各种复杂情况的数据采集情景,file_get_contents显得有点无能为力,cURL在数据采集情景复杂的环境下略显优势。cURL函数的curl_setopt里面还有很多参数,读者可以抽空整体看一遍,虽然平时未必用得上,但是至少做到心里有底,知道都有哪些参数,必要时还能找出来使用。本文仅粗略介绍了file_get_contents函数和cURL函数的基本使用:

curl post方式获取数据
//调用示例
$post_data = array ("category" => "9");
echo postCurl('http://fity.cn/category.php',$post_data);

//CURL函数--POST方式请求资源
function postCurl($api_url, $post_data){
    $ch = curl_init(); // 初始化CURL句柄
    curl_setopt($ch, CURLOPT_URL, $api_url); // 设置访问的url地址
    curl_setopt($ch, CURLOPT_TIMEOUT, 35); // 设置超时
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); // 等待的时间,如果设置为0,则不等待
    curl_setopt($ch, CURLOPT_HEADER, false); // 设定是否输出页面内容
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设定是否显示头信息
    curl_setopt($ch, CURLOPT_POST, true);  // post数据
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);// post的变量
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"); // 模拟浏览器头信息
    curl_setopt($ch, CURLOPT_REFERER, "http://www.x.com"); // 伪造来源地址
    $data = curl_exec($ch);
    curl_close($ch);
  if ($data) {
    return $data;
  } else {
    return false;
  }
}
file_get_contents post方式获取数据
$postdata = array ('category' => 9);
$postdata = http_build_query($postdata);
$opts = array (
  'http' => array (
  'method' => 'POST',
  'content' => $postdata
)
);
$context = stream_context_create($opts);
$html = file_get_contents('http://fity.cn/category.php', false, $context);
echo $html;

[!--infotagslink--]

相关文章

  • Linux下PHP安装curl扩展支持https例子

    安装curl扩展支持https是非常的重要现在许多的网站都使用了https了,下面我们来看一篇关于PHP安装curl扩展支持https例子吧。 问题: 线上运行的lamp服务器,默认yu...2016-11-25
  • php使用floor去掉小数点的例子

    floor会产生小数了如果我们不希望有小数我们是可以去除小数点的了,下面一聚教程小编来为各位介绍php使用floor去掉小数点的例子,希望对各位有帮助。 float floor (...2016-11-25
  • JS跨浏览器解析XML应用过程详解

    这篇文章主要介绍了JS跨浏览器解析XML应用过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-16
  • C# Hook钩子实例代码 截取键盘输入

    C# Hook钩子实例代码之截取键盘输入,需要的朋友可以参考下...2020-06-25
  • 实例讲解Ruby中的钩子方法及对方法调用添加钩子

    钩子方法即是在普通的方法上添加"钩子",使特定事件发生时可以被调用,下面就来以实例讲解Ruby中的钩子方法及对方法调用添加钩子...2020-06-30
  • vivo X9如何查出后台偷跑流量应用?vivo X9查出后台偷跑流量应用的方法

    vivo X9如何查看后台流量偷跑的情况?小编教你轻松查到!还不了解的小伙伴快来看看吧! 1)打开手机自带的【i管家】应用,打开后点击【流量监控】选项。(如下图) 2)接着选...2016-12-31
  • Drupal模块开发之创建自己的钩子

    Drupal可以让第三方模块创建自己的钩子。在通常的实践中,有两种类型的钩子你可能想要创建,一种是内容修改类的钩子,一种是拦截类的钩子。 Drupal的钩子系统允许和模...2016-11-25
  • PHP云存储Redis的应用场景与Redis实现排行榜功能

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。本文我们来讲解Redis的应用场景实例。 C...2016-11-25
  • PHP explode()函数的几个应用和implode()函数有什么区别

    explode()函数介绍explode() 函数可以把字符串分割为数组。语法:explode(separator,string,limit)。 参数 描述 separator 必需。规定在哪里分割字符串。 string...2015-11-08
  • 纯Css实现下拉菜单的简单例子

    下面我们来看一篇关于纯Css实现下拉菜单的简单例子,希望这篇文章能够给各位同学带来帮助,具体步骤如下. 大家可能会经常用到hover这属性,用hover实现鼠标经过的颜...2017-01-22
  • PHP Libevent扩展安装配置及简单应用

    Libevent 是一个用C语言编写的、轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,下文我们就一起来看PHP Libevent扩展安装...2016-11-25
  • php中echo <<< 的应用

    <? $a="变量的值将被带入"; echo <<< help <pre> php中echo <<< 的应用 虽然echo "...";可以断行,但若其中如出现",则仍需做转义 处理。需写做: echo " ...2016-11-25
  • 解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题

    这篇文章主要介绍了解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • PHP-GTK 介绍及其应用

    1. PHP-GTK介绍 1.1 PHP-GTK PHP-GTK是PHP的延伸模组,它可以让程式设计师写出在客户端执行的、且独立的GUI的程式。这个模组不允许在浏览器上显视GTK+的程式,它一开始就...2016-11-25
  • Vue中keep-alive的两种应用方式

    这篇文章主要介绍了Vue中keep-alive的两种应用方式,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-15
  • php时间日期对比与日期加减例子

    在php中日期对比用得比较多了,还有一个日期加减也用到不少,下面我拿两个例子来给大家介绍在php中日期操作方法吧,希望文章能给你带来帮助 功能需求 文章发布时段操...2016-11-25
  • php更新修改excel中的内容例子

    本例子不是读取Excel或生成新的Excel,而是读取现有的Excel文件,然后修改Excel中的数据,就像修改mysql中数据一样的哦。 代码如下 ...2016-11-25
  • php正则获取文章内容中图片地址例子

    正则提取图片中的地址我们介绍过很多的相关文章了,下面再来给各位介绍一个可以提取内容中第一张图片的例子,希望对各位有帮助。 代码如下 复制代码 ...2016-11-25
  • php获取QQ头像并显示的例子

    最近看到博客留言的头像有点别扭,因为游客的头像都是同一个头像,看着不是很舒服。虽然现在绝大多数的主题集成了Gavatar头像功能,先不说gavatar被墙的问题,我自己现在都没...2016-11-25
  • ajax简单与ajax+php实例应用(1/4)

    [ajax介绍]   ajax是使用客户端脚本与web服务器交换数据的web应用开发方法。web页面不用打断交互流程进行重新加裁,就可以动态地更新。使用ajax,用户可以创建接近本地...2016-11-25