深入分析PHP const与define使用区别

 更新时间:2016年11月25日 14:58  点击:2251
const是用于类成员常量的定义了,定义之后不可改,而define我们定义的是全局常量了, 这样我们在其它地方访问但不能改变了,具体还有一些细节我们下面给各位列出来吧

注意:define不能定义在类中,而const必须定义在类中,并且const必须通过类名::变量名来进行访问


1、const用于类成员变量定义,一旦定义且不能改变其值。define定义全局常量,在任何地方都可以访问。
2、define不能在类中定义而const可以。
3、const不能在条件语句中定义常量

4、const采用一个普通的常量名称,define可以采用表达式作为名称。
5、const只能接受静态的标量,而define可以采用任何表达式。
6、const 总是大小写敏感,然而define()可以通过第三个参数来定义大小写不敏感的常量
7.使用const简单易读,它本身是一个语言结构,而define是一个方法,用const定义在编译时比define快很多。

define是定义常量的,如果在类中定义常量呢?当然不能用define,而用const,如下例:

 代码如下 复制代码

<?php
//在类外面通常这样定义常量
define("PHP","111cn.net");
class MyClass
{
    //常量的值将始终保持不变。在定义和使用常量的时候不需要使用$符号
    const constant = 'constant value';
 
    function showConstant() {
        echo  self::constant . "<br>";
    }
}
 
echo MyClass::constant . "<br>";
 
$classname = "MyClass";
echo $classname::constant . "<br>"; // PHP 5.3.0之后
 
$class = new MyClass();
$class->showConstant();
echo $class::constant."<br>"; // PHP 5.3.0之后
//print_r(get_defined_constants());  //可以用get_defined_constants()获取所有定义的常量
?>


一般是define在类外定义常量,const在类内定义常量,并且const必须通过类名::变量名来进行访问。但是php5.3以上支持类外通过const定义常量,看如下,这样是ok的:

 代码如下 复制代码


<?php
    //@blog<http://www.111cn.net>
    const a = "abcdef";
    echo a;
?>

关于常量的基础知识,这里不说了,除了以上,define和const的其它区别(摘自网络):

1.const不能再条件语句中定义常量,但是define是可以的,如下:

 

 代码如下 复制代码
<?php
    if(1){
        const a = 'java';
    }
    echo a;  //必错
?>

2.const采用一个普通的常量名称,define可以采用表达式作为名称

 代码如下 复制代码


<?php
const  FOO = 'PHP';
 
for ($i = 0; $i < 32; ++$i) {
    define('PHP_' . $i, 1 << $i);
}
?>

3.const只能接受静态的标量,而define可以采用任何表达式。

 

 代码如下 复制代码
<?php
const PHP = 1 << 5;    // 错误
define('PHP', 1 << 5); // 正确
?>

4.const本身就是一个语言结构。而define是一个函数。所以使用const速度要快的多。

两个共同步:两者都是不能进行重新赋值。

CURL函数需我们打开CURL模块才可以支持了,这个在php.ini默认安装时是不支持CURL函数的,如果要使用curl函数我们需开启CURL模块哦。

如我先做个测试我们php.ini

代码

 代码如下 复制代码

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //如果把这行注释掉的话,就会直接输出
$result=curl_exec($ch);
curl_close($ch);

错误提示


Fatal error: Call to undefined function curl_init() in E:/www/test.php on line 4

这个是告诉我们函数未定义了,这是php内置函数怎么可能未定义了呢,我们查看php.ini文件,发现如下状态

;extension=php_curl.dll

这个是未开启状态了,我们先去掉前面的;号了

extension=php_curl.dll

再重启apache然后再运行代码效果如下

//成功访问了www.111cn.net网站了

总结,其实使用curl是非常的简单的我们只要在php.ini中把extension=php_curl.dll前面的;号去掉即可。

一个合格的程序员在实现数据入库中时我们都会有一些非常严密的过滤与数据规则了,像我们文件上传时在前段要判断用户是否选择上传文件同时在后台也可判断是否有上传的文件了,下面我们就一起来看看相关例子吧。

如下html代码如

 代码如下 复制代码

<formaction="?"method="post"enctype='multipart/form-data'>
文件上传:<inputtype="file"name="file"id="file"/>
<inputtype="submit"id="send"value="提交"/>
</form>


我们最常用的在前端简单的进行判断

 代码如下 复制代码

<script>
varsend=document.getElementById("send");
send.onclick=function(){
varfile=document.getElementById("file").value;
if(file.length<1){
alert('请选择图片');
returnfalse;
}
}
</script>

如果要做真正的安全我们需要在后台进入判断处理

 代码如下 复制代码

<?php
//判断pic文件框是否已经选择文件
if(!empty($_FILES['file']['tmp_name'])){
echo'已选择文件';
}else{
echo'请选择文件';
}
//PS:$_FILES后面的['tmp_name']一定不要忘写,它表示是一个临时的意思
?>

安例分析

js判断是比较笼统了我们只是使用了file=document.getElementById("file").value;来判断file有没有值或不为空了,这样只要输入一个数字就可以直接提交了,所以我们需要进入如上传文件的用户名限制

 代码如下 复制代码

functionCheckWorkFile()
{
varobj=document.getElementById('fuMain');
if(obj.value=='')
{
alert('请选择要上传的作业书文件');
returnfalse;
}
varstuff=obj.value.match(/^(.*)(\.)(.{1,8})$/)[3];
if(stuff!='doc')
{
alert('文件类型不正确,请选择.doc文件');
returnfalse;
}
returntrue;
}

对于php处理我们也只使用了if(!empty($_FILES['file']['tmp_name'])){来判断不为空了,其实这样也是不合理的

如我们可以如此处理

 代码如下 复制代码

function file_type($filename)
{
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
    $fileType = '';
    switch ($typeCode)
    {
        case 7790:
            $fileType = 'exe';
            break;
        case 7784:
            $fileType = 'midi';
            break;
        case 8297:
            $fileType = 'rar';
            break;       
  case 8075:
            $fileType = 'zip';
            break;
        case 255216:
            $fileType = 'jpg';
            break;
        case 7173:
            $fileType = 'gif';
            break;
        case 6677:
            $fileType = 'bmp';
            break;
        case 13780:
            $fileType = 'png';
            break;
        default:
            $fileType = 'unknown: '.$typeCode;
    }

 //Fix
 if ($strInfo['chars1']=='-1' AND $strInfo['chars2']=='-40' ) return 'jpg';
 if ($strInfo['chars1']=='-119' AND $strInfo['chars2']=='80' ) return 'png';

    return $fileType;
}

echo file_type('start.php');   // 6063 or 6033

这样我们可以限制上传文件类型的同时也给程序做了一个安全处理了哦

php中三元运算符又被叫做三目运算符了,其实我常把它叫作问号运行符其实都可以这样做,三元运算符可以实现简单的条件判断功能,下在我来给各位介绍一些三元运算符的例子。

三元运算符的功能与“if....else”流程语句一致,它在一行中书写,代码精练、执行效率高。在PHP程序中恰当地使用三元运算符能够让脚本更为简洁、高效。代码的语法如下:

(expr1)?(expr2):(expr3); //表达式1?表达式2:表达式3

解释:如果条件“expr1”成立,则执行语句“expr2”,否则执行“expr3”。

 代码如下 复制代码

<?PHP
$a=10; $b=20;
$c=$a>$b?($a-$b):($a+$b);
//说明:如果变量a大于变量b则执行问号后面的,否则就执行:冒号后面的
echo $c;
?>

表达式里可以是函数、数组等等。

事实上,三元运算符可以扩展使用,当设置的条件成立或不成立,执行语句都可以不止一句,试看以下格式:

 代码如下 复制代码

(expr1) ? (expr2).(expr3) : (expr4).(expr5);

我们非常明显地看到,多个执行语句可以使用用字符串运算符号(“.”)连接起来,各执行语句用小角括号包围起来以表明它是一个独立而完整的执行语句。这样扩展后它的功能更为逼近“if...else”流程语句。
同时三元运算符还可以嵌套使用。例如,a大于b成立时:如果a小于c,那么x=c-a否则x=a-c;否则a小于b成立时:如果b小于c,那么x=c-b否则x=b-c:

 代码如下 复制代码

$a>$b ? $x=($a<$c ? $c-$a : $a-$c) : $x=($b<$c ? $c-$b : $b-$c);

嵌套使用的三元运算符可读性不太好,日后对代码的维护极可能存在问题,所以像这种情况我们还是直接使用if else if 来实现吧。

通常我们对于数据遍历会使用到foreach来操作当然也有使用到while list each函数来实现了,但在方便面上来看foreach更简洁好用性能也非常的不错,下面本人整理了一款在开发应用中foreach前后使用例子,希望对大家会有所帮助。

简单的一个php数组函数,之前没这个需要一直都不知道有这么一个函数,擦汗...

php数组逆序输出代码

 代码如下 复制代码
foreach(array_reverse($array) AS $key=>$value){
echo $value.'
';
}

 
array_reverse
(PHP 4, PHP 5)
array_reverse — 返回一个单元顺序相反的数组

说明

array array_reverse ( array $array [, bool $preserve_keys ] )
array_reverse() 接受数组 array 作为输入并返回一个单元为相反顺序的新数组,如果 preserve_keys 为 TRUE 则保留原来的键名。

Example #1 array_reverse() 例子

 代码如下 复制代码

<?php
$input  = array("php", 4.0, array("green", "red"));
$result = array_reverse($input);
$result_keyed = array_reverse($input, TRUE);
?>

这将使 $result 和 $result_keyed 具有相同的单元,但是注意键名的区别。$result 和 $result_keyed 的打印输出显示分别为:
Array
(
    [0] => Array
        (
            [0] => green
            [1] => red
        )

    [1] => 4
    [2] => php
)
Array
(
    [2] => Array
        (
            [0] => green
            [1] => red
        )

    [1] => 4
    [0] => php
)

例子,在PHP模板引擎中

模板文件:

 代码如下 复制代码

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>{$web_tile}</title>
</head>
<body>
{$article_title}
<br/>
  -- by {$author}
<hr/>
<br/>
{$content}
<br/>
-- publish @ {$time}

<br/>
<br/>
foreach test:

{foreach ( from=url key=b item=c )}
 <a href="index.php?artcle_id={==b}">{==c}</a>
{/foreach}

<br/>

</body>
</html>

解析引擎:

 代码如下 复制代码
// var
  $pattern_var = "/{$left_tag}\\$([\w\d]+){$right_tag}/";
  $replace_var = '<?php echo \$this->var_tpl_arr["$1"];?>';
  
  if (preg_match($pattern_var, $content)) {
   $content = preg_replace($pattern_var, $replace_var, $content);
  }
  
  // foreach
  preg_match_all("/{$left_tag}foreach\s+([^{]+?){$right_tag}/is", $content, $match_foreach);
  if (isset($match_foreach[1]) && is_array($match_foreach)) {
   foreach($match_foreach[1] as $match_key => $match_value) {
    $split_foreachs = array_filter(preg_split('/\s+/is', $match_value));
    $new_foreach_tag = array();
    foreach($split_foreachs as $split_foreach) {
     $split = explode("=", $split_foreach);
     if (count($split == 2)) {
      if(in_array($split[0], array("from","item","key"))) {
//过滤标签 不存在过滤
       $new_foreach_tag[$split[0]] = $split[1];
      }
     }
    }
    
    $from = $key = $item = '';
    extract($new_foreach_tag);
    $key = ($key) ? '$'.$key.' =>' : '' ;
    $replace_foreach = '<?php foreach($this->var_tpl_arr["'.$from.'"] as '.$key.' $'.$item.') { ?>';
    $content = str_replace($match_foreach[0][$match_key], $replace_foreach, $content);
    
   }
  }
  
  $pattern_foreach = "/{$left_tag}\/foreach{$right_tag}/";
  $replace_foreach = "<?php } ?>";
  if (preg_match($pattern_foreach, $content)) {
   $content = preg_replace($pattern_foreach, $replace_foreach, $content);
  }
  
  // var in statement
  $pattern_var = "/{$left_tag}==([\w\d]+){$right_tag}/";
  $replace_var = '<?php echo \$$1;?>';
  
  if (preg_match($pattern_var, $content)) {
   $content = preg_replace($pattern_var, $replace_var, $content);
  }

解析后:

 代码如下 复制代码

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><?php echo $this->var_tpl_arr["web_tile"];?></title>
</head>
<body>
<?php echo $this->var_tpl_arr["article_title"];?>
<br/>
  -- by <?php echo $this->var_tpl_arr["author"];?>
<hr/>
<br/>
<?php echo $this->var_tpl_arr["content"];?>
<br/>
-- publish @ <?php echo $this->var_tpl_arr["time"];?>

<br/>
<br/>
foreach test:

<?php foreach($this->var_tpl_arr["url"] as $b => $c) { ?>
 <a href="index.php?artcle_id=<?php echo $b;?>"><?php echo $c;?></a>
<?php } ?>

<br/>

</body>
</html>

使用:

 代码如下 复制代码

<?php

require_once 'core/YATP.class.php';

$app = new YATP();
date_default_timezone_set("Asia/Shanghai");
$app->is_cache = false;

$article_title = "yet,it is a simple template engine";
$author = "sanwhiteyu@tencent.com";
$web_tile = "just test ";
$content = "It is easy to write a simple template engine for yourself,what u can do is try to do it!";
$time = date("Y-m-d H:i:s",time());

$url = array(
  "url1"=>"http://www.111cn.net",
  "url2"=>"http://www.111cn.net",
);

$app->assign("article_title",$article_title);
$app->assign("author",$author);
$app->assign("web_tile",$web_tile);
$app->assign("content",$content);
$app->assign("time",$time);
$app->assign("url",$url);
$app->display("index.html");


// end of script

[!--infotagslink--]

相关文章

  • mysql_connect与mysql_pconnect的区别详解

    在mysql中我们会看到有两种常用的数据库连接模式,一种是长久连接,另一各是页面访问完之后就断了连接,下面我来分别介绍mysql_connect与mysql_pconnect的区别,有需要了解...2016-11-25
  • 图解PHP使用Zend Guard 6.0加密方法教程

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

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • 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
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 如何使用php脚本给html中引用的js和css路径打上版本号

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

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
  • 安装和使用percona-toolkit来辅助操作MySQL的基本教程

    一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • PHP实现无限级分类(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
  • php类的使用实例教程

    php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
  • 使用jquery修改表单的提交地址基本思路

    基本思路: 通过使用jquery选择器得到对应表单的jquery对象,然后使用attr方法修改对应的action 示例程序一: 默认情况下,该表单会提交到page_one.html 点击button之后,表单的提交地址就会修改为page_two.html 复制...2014-06-07
  • 双冒号 ::在PHP中的使用情况

    前几天在百度知道里面看到有人问PHP中双冒号::的用法,当时给他的回答比较简洁因为手机打字不大方便!今天突然想起来,所以在这里总结一下我遇到的双冒号::在PHP中使用的情况!双冒号操作符即作用域限定操作符Scope Resoluti...2015-11-08
  • MYSQL事务回滚的2个问题分析

    因此,正确的原子操作是真正被执行过的。是物理执行。在当前事务中确实能看到插入的记录。最后只不过删除了。但是AUTO_INCREMENT不会应删除而改变值。1、为什么auto_increament没有回滚?因为innodb的auto_increament的...2014-05-31
  • C#中out与ref的区别实例解析

    这篇文章主要介绍了C#中out与ref的区别实例解析,对C#初学者有不错的学习借鉴价值,需要的朋友可以参考下...2020-06-25
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04