PHP declare控制符及ticks的例子详解

 更新时间:2016年11月25日 14:58  点击:1742
declare是PHP的流程控制结构,directive目前支持两个指令【ticks和encoding】,ticks的使用需配合register_tick_function函数(当然还有unregister_tick_function函数)使用。

declare 结构用来设定一段代码的执行指令,它的语法结构如下:

    declare (directive)

        statement


不懂?通俗解释如下:

ticks参数表示运行多少语句调用一次register_tick_function的函数。
register_tick_function函数定义了每个tick事件发生时的处理函数。那么什么是tick事件呢?

tick是一个事件。

tick事件在PHP每执行N条低级语句就发生一次,N由declare语句指定。
可以用register_tick_function()来指定tick事件发生时应该执行的操作。


问题又来了,什么是低级语句呢?它包括:

简单语句:空语句(就一个;号),return, break, continue, throw, goto, global, static, unset, echo,  内置的HTML文本,分号结束的表达式等均算一个语句。
    复合语句:完整的if/elseif, while, do...while, for, foreach, switch, try...catch等算一个语句。
    语句块:{} 括出来的语句块。
    最后特别的:declare块本身也算一个语句(按道理declare块也算是复合语句,但此处特意将其独立出来)。


看一个简单的例子:

 代码如下 复制代码

/**
 * declare
 * @link http://www.111cn.net
 */
function do_tick()
{
        echo "<font color=red>do_tick</font>";
}
 
register_tick_function('do_tick');
 
declare(ticks = 1)
{
        for($i = 1; $i < 5; $i++)
        {
                echo "<font color=blue>{$i}</font><br>";
        }
}


上面这段程序的运行结果:

PHP declare控制符及ticks的例子详解
PHP declare控制符及ticks详细教程对结果解释下:

第一次进入for循环,执行echo后执行第一次do_tick函数;
第一次for循环结束后;执行第二次do_tick函数;
循环四次......;
第五次进行for循环,条件不满足,for循环结束,执行一次do_tick函数;
declare本身也是一条语句,也要执行一次do_tick函数。

从上可以看出,declare和ticks可以用来做调试或性能测试。

PHP中字符串中的字符可以通过一个以0为开始的,用类似数组结构中的方括号包含对应的数字来查找和修改,如获取第二个$str[1]或$str{1} ,不建议使用{},最好使用[] 测试如下:
 代码如下 复制代码


//获取字符最后一个字符
$str = '111cn.net';
echo $str[strlen($str)-1]; //m
 
//修改第一个字符
$str = '111cn.net';
$str[0] = 'a';  //ahpddt.com
 
//方括号中的数字超出范围将会产生空白。 
$str = '111cn.net';
$str[100] = 'y';  //111cn.net y
 
//如果是非整数类型被转换成整数
$str = '111cn.net';
$str['a'] = 'y'; //111cn.net y
 
$str = '111cn.net';
$str[-1] = 'y'; //负数会出错:Warning: Illegal string offset: -1

原文来自:phpddt.com

我们需要写一个简单的函数可以获取指定时间日期内的一段日期列表,下面我找到一个比较合适的方法与各位朋友分享。

最近在做一个关于日程表的项目,给出一个开始时间和一个结束时间,需要列出这个时间段内的日期列表并同时判断是周几。经过研究,得出如下方法,和大家共享,方便有需要的朋友。

先贴一下此次需求的效果图:

PHP如何获取一段时间内的日期列表

 代码如下 复制代码
/*
*参数分别是开始时间戳,结束时间戳
*/
function timeList($beginTimeStamp,$endTimeStamp){
 if(!is_numeric($beginTimeStamp)||!is_numeric($endTimeStamp)||($endTimeStamp<=$beginTimeStamp)) return '';
 $tmp=array();
    for($i=$beginTimeStamp;$i<=$endTimeStamp;$i+=(24*3600)){
  $tmp['timeStampList'][]=$i;
        $tmp['dayList'][]=date('Y年m月d日',$i);
  $tmp['dayWeek'][]=getWeek($i);
    }
 return $tmp;
}
function getWeek($timestamp){
 $timestamp=date('w',$timestamp);
 $str='';
 switch($timestamp){
  case '0':
   $str.='周日';
  break;
  case '1':
   $str.='周一';
  break;
  case '2':
   $str.='周二';
  break;
  case '3':
   $str.='周三';
  break;
  case '4':
   $str.='周四';
  break;
  case '5':
   $str.='周五';
  break;
  case '6':
   $str.='周六';
  break;
 }
 return $str;
}


php获取某段时间内每个月的方法,返回由这些月份组成的数组

 代码如下 复制代码

/**
* 生成从开始月份到结束月份的月份数组
* @param int $start 开始时间戳
* @param int $end 结束时间戳
*/
function monthList($start,$end){
 if(!is_numeric($start)||!is_numeric($end)||($end<=$start)) return '';
 $start=date('Y-m',$start);
 $end=date('Y-m',$end);
 //转为时间戳
 $start=strtotime($start.'-01');
 $end=strtotime($end.'-01');
 $i=0;//http://www.phpernote.com/php-function/224.html
 $d=array();
 while($start<=$end){
  //这里累加每个月的的总秒数 计算公式:上一月1号的时间戳秒数减去当前月的时间戳秒数
  $d[$i]=trim(date('Y-m',$start),' ');
  $start+=strtotime('+1 month',$start)-$start;
  $i++;
 }
 return $d;
}例如:

echo '<pre>';print_r(monthList(1395283229,1398960000));


例如:

echo '<pre>';print_r(monthList(1395283229,1398960000));结果将得到如下:

Array
(
    [0] => 2014-03
    [1] => 2014-04
    [2] => 2014-05
)

这是最简单的类型。 boolean 表达了真值,可以为 TRUE 或 FALSE ,布尔类型也是我们开发中常碰到的功能,下面我就来给各位同学整理一下它的用法。

语法:

要指定一个布尔值,使用关键字 TRUE 或 FALSE 。两个都不区分大小写。 

 

 代码如下 复制代码
<?php
$foo  =  True ;  // assign the value TRUE to $foo
?>

通常运算符所返回的 boolean 值结果会被传递给控制流程。 

 代码如下 复制代码

<?php
// == 是一个操作符,它检测两个变量是否相等,并返回一个布尔值
if ( $action  ==  "show_version" ) {
    echo  "The version is 1.23" ;
}

// 这样做是不必要的...
if ( $show_separators  ==  TRUE ) {
    echo  "<hr>n" ;
}

// ...因为可以使用下面这种简单的方式:
if ( $show_separators ) {
    echo  "<hr>n" ;
}
?>

转换为布尔值

要明确地将一个值转换成 boolean ,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换。 

当转换为 boolean 时,以下值被认为是 FALSE : 


1.布尔值 FALSE 本身
2.整型值 0(零)
3.浮点型值 0.0(零)
4.空字符串,以及字符串 "0"
5.不包括任何元素的数组
6.不包括任何成员变量的对象(仅 PHP 4.0 适用)
7.特殊类型 NULL(包括尚未赋值的变量)
8.从空标记生成的 SimpleXML 对象
所有其它值都被认为是 TRUE (包括任何资源)。

注意:1 和其它非零值(不论正负)一样,被认为是 TRUE ! 

 

 代码如下 复制代码
<?php
var_dump ((bool)  "" );         // bool(false)
var_dump ((bool)  1 );          // bool(true)
var_dump ((bool) - 2 );         // bool(true)
var_dump ((bool)  "foo" );      // bool(true)
var_dump ((bool)  2.3e5 );      // bool(true)
var_dump ((bool) array( 12 ));  // bool(true)
var_dump ((bool) array());    // bool(false)
var_dump ((bool)  "false" );    // bool(true)
?>
刚看PHP手册中 Boolean 布尔类型 数据类型时,看到了评论中一个关于运算符优先级的问题,以前也讲过在实际项目中不要出现这些需要人为判断运算符优先级的代码,都应该使用括号来规避这个问题的出现

周五一朋友来着一段代码来问我,说他看不懂这段代码,觉得这段代码有问题,代码类似:

 代码如下 复制代码

$array1 = array(1, 2);
$array2 = array(3, 4);

$result = empty($array1) == 3 ? $array1 : $array2;

我一看应该是运算符优先级的问题。
按理说,这些运算符优先级的问题是不应该让它出现在项目代码中的,只能让它在面试问题中,程序员应该在书写代码过程中使用括号来避免这种不确定问题的出现。项目中的代码应该是那种我们一看就知道结果的,而不是需要我们费劲脑子才能知道结果的。这种优先级代码的结果有时候并不是我们相信的那样,看看下面的例子:

 代码如下 复制代码

<?php
if ($a = 100 && $b = 200) {
     var_dump($a, $b);
}

上面代码也许你会认为是:

 代码如下 复制代码
<?php
if ($a = (100 && $b) = 200) {
     var_dump($a, $b);
}

但是实际上不是这样的,实际结果是:

 代码如下 复制代码
<?php
if ($a = (100 && $b = 200)) {
     var_dump($a, $b);
}

至于为什么会这样?那是因为PHP并不完全遵守优先级的定义,PHP手册上中有说明

Note: Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.

代码:

代码1:

 代码如下 复制代码

<?php
$x=TRUE;
$y=FALSE;
$z=$y OR $x; ?>
代码2:
<?php
$x=TRUE;
$y=FALSE;
$z=$y || $x;
?>

这种代码在实际项目中是不应该出现的,都应该用下面的代码替换:

 代码如下 复制代码

$z = ($y OR $x);

$z = ($y || $x);

[!--infotagslink--]

相关文章

  • Windows VPN服务器配置图文教程 超详细版

    VPN可以虚拟出一个专用网络,让远处的计算机和你相当于处在同一个局域网中,而中间的数据也可以实现加密传输,用处很大,特别是在一些大公司,分公司处在不同的区域。...2016-01-27
  • 解决执行maven命令时提示Process terminated的问题

    这篇文章主要介绍了解决执行maven命令时提示Process terminated的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-25
  • PS滤镜里为什么没有素描?PS CS6素描滤镜在哪?

    我们在作图的时候需要用到“素描”滤镜,但是点开滤镜选项就是找不到。该怎么快速找到“素描”滤镜呢?请往下看。 1、点开滤镜选项时,发现没有素描这一项。2、别急,我...2017-01-22
  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • Cloudflare国内自选IP节点整理收录

    一般来说为了达到隐藏自身 IP,我们都会选择一些 CDN 服务,目前用的最多的免费 CDN 是 Cloudflare。但是正常情况下 Cloudflare 是不能自己选择IP,有时候分配给我们的 IP 可能表现不佳,也只能将就着用。但是我们都希望可以用上 CF 比较快的 IP。那么自选IP,就显得很必要了。...2022-09-23
  • Mybatis Plus select 实现只查询部分字段

    这篇文章主要介绍了Mybatis Plus select 实现只查询部分字段的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-01
  • MySQL性能监控软件Nagios的安装及配置教程

    这篇文章主要介绍了MySQL性能监控软件Nagios的安装及配置教程,这里以CentOS操作系统为环境进行演示,需要的朋友可以参考下...2015-12-14
  • php file_get_contents 设置代理抓取页面示例

    file_get_contents函数在php中可以直接打开本地文件也可以直接抓取远程服务器文件,如果简单的采集我们可以使用file_get_contents直接来操作,如果有防采集我们可能需要...2016-11-25
  • 解决Mybatis 大数据量的批量insert问题

    这篇文章主要介绍了解决Mybatis 大数据量的批量insert问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-09
  • JavaScript判断浏览器及其版本信息

    本篇文章主要分享了通过window.navigator来判断浏览器及其版本信息的实例代码。具有一定的参考价值,下面跟着小编一起来看下吧...2017-01-23
  • mybatis-plus 表名添加前缀的实现方法

    这篇文章主要介绍了mybatis-plus 表名添加前缀的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-26
  • iOS APP h5快捷程序 .mobileconfig的生成

    1.从APP Store 下载Apple Configurator 2从一个管理点管理所有iOS设备应用程序,文档和配置文件。想要确保您的所有家庭成员在其每台iOS设备上都有类似的应用和文档,管理日益增...2021-12-23
  • Redis连接池配置及初始化实现

    这篇文章主要介绍了Redis连接池配置及初始化实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-29
  • 详解如何清理redis集群的所有数据

    这篇文章主要介绍了详解如何清理redis集群的所有数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-18
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • mybatis-plus 返回部分字段的解决方式

    这篇文章主要介绍了mybatis-plus 返回部分字段的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-02
  • mybatis的Configuration详解

    这篇文章主要介绍了mybatis的Configuration详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-04
  • js实现浏览器打印功能的示例代码

    这篇文章主要介绍了js如何实现浏览器打印功能,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-15
  • pandas pd.read_csv()函数中parse_dates()参数的用法说明

    这篇文章主要介绍了pandas pd.read_csv()函数中parse_dates()参数的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-05
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02