php 全局变量global

 更新时间:2016年11月25日 15:13  点击:2499

php 全局变量global

“global”关键字的演示例子:

以下为引用的内容:

以下为引用的内容:

<?php

$my_var = 'Hello World';

test_global();

function test_global() {

    // Now in local scope
   
    // the $my_var variable doesn't exist
   
    // Produces error: "Undefined variable: my_var"
   
    echo $my_var;
   
    // Now let's important the variable
   
    global $my_var;
   
    // Works:
   
    echo $my_var;
   
}

?>
 


正如你在上面的例子中看到的一样,“global”关键字是用来导入全局变量的。看起来它工作的很好,而且很简单,那么为什么我们还要担心使用“global”关键字来定义全局数据呢?

下面是三个很好的理由:

1、  代码重用几乎是不可能的

如果一个函数依赖于全局变量,那么想在不同的环境中使用这个函数几乎是不可能的。另外一个问题就是你不能提取出这个函数,然后在其他的代码中使用。

2、  调试并解决问题是非常困难的

跟踪一个全局变量比跟踪一个非全局变量困难的多。一个全局变量可能会在一些不明显的包含文件中被重新定义,即使你有一个非常好的程序编辑器(或者IDE)来帮助你,你也得花了几个小时才能发现这个问题所在。

3、  理解这些代码将是非常难的事情

你很难弄清楚一个全局变量是从哪里来得,它是用来做什么的。在开发的过程中,你可能会知道知道每一个全局变量,但大概一年之后,你可能会忘记其中至少一般的全局变量,这个时候你会为自己使用那么多全局变量而懊悔不已。
那么如果我们不使用全局变量,我们该使用什么呢?下面让我们看看一些解决方案。

使用函数参数

停止使用全局变量的一种方法就是简单的把变量作为函数的参数传递过去,如同下面所示:

以下为引用的内容:

以下为引用的内容:

<?php

$var = 'Hello World';

test ($var);

function test($var) {

    echo $var;
}

?>
 


如果你仅仅只需要传递一个全局变量,那么这是一种非常优秀甚至可以说是杰出的解决方案,但是如果你要传递很多个值,那该怎么办呢?

比如说,假如我们要使用一个数据库类,一个程序设置类和一个用户类。在我们代码中,这三个类在所有组件中都要用到,所以必须传递给每一个组件。如果我们使用函数参数的方法,我们不得不这样:

以下为引用的内容:

以下为引用的内容:

<?php

$db = new DBConnection;

$settings = new Settings_XML;

$user = new User;

test($db, $settings, $user);

function test(&$db, &$settings, &$user) {

    // Do something
   
}

?>
 

 

php imagecreatetruecolor图像裁剪
任意图像裁剪成固定大小,图像不变形,空白处拉伸填充,图像始终铺满,不留空白,用过bcastr的朋友应该知道,bcastr就是保证了图像调用的不变形,对一个固定大小输出的图像框,源图有以下几种情况:
1:需要输出的图像的高宽比源图的高宽都小,写成判断 $new_width<$src_width && $new_height<$src_width
2:需要输出的图像的高宽比原图的高宽都大,写成判断 $new_width>$src_width && $new_height>$src_width
3:排除第1,2两种,即一边放大,一边缩小的情况加上等于的判断
对于1,2,函数处理代码完全相同,所以可以归纳成一个处理语句

给出 php 实现代码

<?php
/*
* 说明:函数功能是把一个图像裁剪为任意大小的图像,图像不变形
* 参数说明:输入 需要处理图片的 文件名,生成新图片的保存文件名,生成新图片的宽,生成新图片的高
* written by smallchicken
* time 2008-12-18
*/
// 获得任意大小图像,不足地方拉伸,不产生变形,不留下空白
function my_image_resize($src_file, $dst_file , $new_width , $new_height)
{
if($new_width <1 || $new_height <1)
{
echo "params width or height error !";
exit();
}
if(!file_exists($src_file))
{
echo $src_file . " is not exists !";
exit();
}
// 图像类型
$type=exif_imagetype($src_file);
$support_type=array(IMAGETYPE_JPEG , IMAGETYPE_PNG , IMAGETYPE_GIF);
if(!in_array($type, $support_type,true))
{
echo "this type of image does not support! only support jpg , gif or png";
exit();
}
//Load image
switch($type)
{
case IMAGETYPE_JPEG :
$src_img=imagecreatefromjpeg($src_file);
break;
case IMAGETYPE_PNG :
$src_img=imagecreatefrompng($src_file);
break;
case IMAGETYPE_GIF :
$src_img=imagecreatefromgif($src_file);
break;
default:
echo "Load image error!";
exit();
}
$w=imagesx($src_img);
$h=imagesy($src_img);
$ratio_w=1.0 * $new_width / $w;
$ratio_h=1.0 * $new_height / $h;
$ratio=1.0;
// 生成的图像的高宽比原来的都小,或都大 ,原则是 取大比例放大,取大比例缩小(缩小的比例就比较小了)
if( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1))
{
if($ratio_w < $ratio_h)
{
$ratio = $ratio_h ; // 情况一,宽度的比例比高度方向的小,按照高度的比例标准来裁剪或放大
}else {
$ratio = $ratio_w ;
}
// 定义一个中间的临时图像,该图像的宽高比 正好满足目标要求
$inter_w=(int)($new_width / $ratio);
$inter_h=(int) ($new_height / $ratio);
$inter_img=imagecreatetruecolor($inter_w , $inter_h);
imagecopy($inter_img, $src_img, 0,0,0,0,$inter_w,$inter_h);
// 生成一个以最大边长度为大小的是目标图像$ratio比例的临时图像
// 定义一个新的图像
$new_img=imagecreatetruecolor($new_width,$new_height);
imagecopyresampled($new_img,$inter_img,0,0,0,0,$new_width,$new_height,$inter_w,$inter_h);
switch($type)
{
case IMAGETYPE_JPEG :
imagejpeg($new_img, $dst_file,100); // 存储图像
break;
case IMAGETYPE_PNG :
imagepng($new_img,$dst_file,100);
break;
case IMAGETYPE_GIF :
imagegif($new_img,$dst_file,100);
break;
default:
break;
}
} // end if 1
// 2 目标图像 的一个边大于原图,一个边小于原图 ,先放大平普图像,然后裁剪
// =if( ($ratio_w < 1 && $ratio_h > 1) || ($ratio_w >1 && $ratio_h <1) )
else{
$ratio=$ratio_h>$ratio_w? $ratio_h : $ratio_w; //取比例大的那个值
// 定义一个中间的大图像,该图像的高或宽和目标图像相等,然后对原图放大
$inter_w=(int)($w * $ratio);
$inter_h=(int) ($h * $ratio);
$inter_img=imagecreatetruecolor($inter_w , $inter_h);
//将原图缩放比例后裁剪
imagecopyresampled($inter_img,$src_img,0,0,0,0,$inter_w,$inter_h,$w,$h);
// 定义一个新的图像
$new_img=imagecreatetruecolor($new_width,$new_height);
imagecopy($new_img, $inter_img, 0,0,0,0,$new_width,$new_height);
switch($type)
{
case IMAGETYPE_JPEG :
imagejpeg($new_img, $dst_file,100); // 存储图像
break;
case IMAGETYPE_PNG :
imagepng($new_img,$dst_file,100);
break;
case IMAGETYPE_GIF :
imagegif($new_img,$dst_file,100);
break;
default:
break;
}
}// if3

php strtr与str_replace区别比较

函数都是具有替换字符功能的。但是strtr比str_replace性能上要块4倍。具体情况请

看如下分解:

首先是strtr函数:

实例1:当

以下为引用的内容:

<?php

//这个时候输出的为baicai而不是bai123cai,因为str("pao")<strlen("bai123")

echo strtr("paocai!","pao","bai123");

?>

 


实例2:当被替换的值长度小于被替换目标的时候

以下为引用的内容:

<?php

//这个时候输出的为laocai而不是lacai,因为str("pao")>strlen("la")
 
echo strtr("paocai!","pao","la");
 
?>
 


实例3:支持数组替换

以下为引用的内容:

<?php

$Arr=array('ao'=>'oa','ai'=>'ia');

echo strtr("paocai!",$Arr); //这个时候输出的为poacia

?>
 


其次是str_replace:

以下为引用的内容:

<?php

echo str_replace("you","paocai","I love you!"); //会输出I love paocai!

?>
 


总结:strtr他是跟字符长度有关系的,但是str_replace就没有关系,估计在运行步骤

的时候会读取字符串长度所以才会比strtr慢很多。

php.ini设置脚本时间

设置php脚本运行时长,有二种设置方法一种在.php文件里面设计,别一种是在php.ini里面设置

方法一php.ini

找到php.ini里面的

 

max_execution_time = 30     ; Maximum execution time of each script, in seconds

把30换成你想要的时间,这里单位为秒


方法二.php文件

@set_time_limit(0);

<?php
 @set_time_limit(0);//为0时代表无限,它的单位也是为秒
?>
 

< ?php  // application library 1  namespace AppLib1;   const MYCONST = 'AppLib1MYCONST';   function MyFunction() {   return __FUNCTION__;  }   class MyClass {   static function WhoAmI() {  eturn __METHOD__;   }  }  ?>  lib2.php

< ?php  // application library 2  namespace AppLib2;   const MYCONST = 'AppLib2MYCONST';   function MyFunction() {   return __FUNCTION__;  }   class MyClass {   static function WhoAmI() {  eturn __METHOD__;   }  }  ?>  开始之前先要理解几个PHP命名空间相关术语。

◆完全限定名称(Fully-qualified name)

任何PHP代码都可以引用完全限定名称,它是一个以命名空间反斜线开头的标识符,如AppLib1MYCONST,AppLib2MyFunction( )等。

完全限定名称是没有任何歧义的,开头的反斜线和文件路径的作用有点类似,它表示“根”全局空间,如果我们在全局空间中实现了一个不同的MyFunction( ),可以使用MyFunction( )从lib1.php或lib2.php调用它。

完全限定名称对一次性函数调用或对象初始化非常有用,但当你产生了大量的调用时它们就没有实用价值了,在下面的讨论中我们将会看到,PHP提供了其它选项以解除我们为命名空间打字的烦恼。

◆限定名称(Qualified name)

至少有一个命名空间分隔符的标识符,如Lib1MyFunction( )。

◆非限定名称(Unqualified name)

没有命名空间分隔符的标识符,如MyFunction( )。

在相同的命名空间内工作

仔细思考下面的代码:

myapp1.php

< ?php  namespace AppLib1;   require_once('lib1.php');  require_once('lib2.php');   header('Content-type: text/plain');  echo MYCONST . "n";  echo MyFunction() . "n";  echo MyClass::WhoAmI() . "n";  ?>  即使我们同时包括了lib1.php和lib2.php,MYCONST,MyFunction和MyClass标识符只能在lib1.php中引用,这是因为myapp1.php的代码在相同的AppLib1命名空间内。

执行结果:

AppLib1MYCONST  AppLib1MyFunction  AppLib1MyClass::WhoAmI  命名空间导入

可以使用use操作符导入命名空间,如:

myapp2.php

< ?php  use AppLib2;   require_once('lib1.php');  require_once('lib2.php');   header('Content-type: text/plain');  echo Lib2MYCONST . "n";  echo Lib2MyFunction() . "n";  echo Lib2MyClass::WhoAmI() . "n";  ?>  可以定义任意数量的use语句,或使用逗号分隔成独立的命名空间,在这个例子中我们导入了AppLib2命名空间,但我们仍然不能直接引用MYCONST,MyFunction和MyClass,因为我们的代码还在全局空间中,但如果我们添加了“Lib2”前缀,它们就变成限定名称了,PHP将会搜索导入的命名空间,直到找到匹配项。

执行结果:

AppLib2MYCONST  AppLib2MyFunction  AppLib2MyClass::WhoAmI 命名空间别名

命名空间别名可能是最有用的构想了,别名允许我们使用较短的名称引用很长的命名空间。

myapp3.php

< ?php  use AppLib1 as L;  use AppLib2MyClass as Obj;   header('Content-type: text/plain');  require_once('lib1.php');  require_once('lib2.php');   echo LMYCONST . "n";  echo LMyFunction() . "n";  echo LMyClass::WhoAmI() . "n";  echo Obj::WhoAmI() . "n";  ?>  第一个use语句将AppLib1定义为“L”,任何使用“L”的限定名称在编译时都会被翻译成“AppLib1”,因此我们就可以引用LMYCONST和LMyFunction而不是完全限定名称了。

第二个use语句定义了“obj”作为AppLib2命名空间中MyClass类的别名,这种方式只适合于类,不能用于常量和函数,现在我们就可以使用new Obj( )或象上面那样运行静态方法了。

执行结果:

AppLib1MYCONST  AppLib1MyFunction  AppLib1MyClass::WhoAmI  AppLib2MyClass::WhoAmI  PHP命名解析规则

PHP标识符名称使用下列命名空间规则进行解析,请参考PHP用户手册了解更详细的信息:

1.在编译时调用完全限定函数、类或常量;

2.非限定名称和限定名称根据导入规则进行翻译,例如,如果ABC导入为C,调用CDe( )就会被翻译成ABCDe( );

3.在PHP命名空间内,所有限定名称尚未根据导入规则转换,例如,如果在命名空间AB中调用CDe( ),那么会被翻译成ABCDe( );

4.非限定类名称根据当前的导入规则进行转换,使用全名替换导入的短名称,例如,如果类C在命名空间AB中被导入为X,那么new X( )就会被翻译为new ABC( );

5.在命名空间中非限定函数调用在运行时解析,例如,如果MyFunction( )在命名空间AB中被调用,PHP首先会查找函数ABMyFunction( ),如果没有找到,然后会在全局空间中查找MyFunction( );

6.调用非限定或限定类名在运行时被解析,例如,如果我们在命名空间AB中调用new C( ),PHP将会查找类ABC,如果没有找到,PHP会尝试自动载入ABC
PHP命名空间高级特性

接下来让我们看一看PHP命名空间的一些高级特性。

__NAMESPACE__常量

__NAMESPACE__是一个PHP字符串,它总是返回当前命名空间的名称,在全局空间中它是一个空字符串。

< ?php  namespace AppLib1;  echo __NAMESPACE__; // outputs: AppLib1  ?>   这个值在调试时非常有用,它也可由于动态生成一个完全限定类名,如:

< ?php  namespace AppLib1;   class MyClass {   public function WhoAmI() {  return __METHOD__;   }  }   $c = __NAMESPACE__ . '\MyClass';  $m = new $c;  echo $m->WhoAmI(); // outputs: AppLib1MyClass::WhoAmI  ?>  namespace关键字

namespace关键字可以用于明确引用一个当前命名空间或子命名空间中的项目,它等价于类中的self命名空间:

< ?php  namespace AppLib1;   class MyClass {   public function WhoAmI() {  return __METHOD__;   }  }   $m = new namespaceMyClass;  echo $m->WhoAmI(); // outputs: AppLib1MyClass::WhoAmI  ?>  自动载入命名空间类

PHP 5中最省时省力的特性是自动载入,在全局(非命名空间)PHP代码中,可以写一个标准自动载入函数:

< ?php  $obj= new MyClass1(); // classes/MyClass1.php is auto-loaded  $obj= new MyClass2(); // classes/MyClass2.php is auto-loaded   // autoload function  function __autoload($class_name) {   require_once("classes/$class_name.php");  }  ?>  在PHP 5.3中,你可以创建一个命名空间类的实例,在这种情况下,完全限定命名空间和类名传递给__autoload函数,例如,$class_name的值可能是AppLib1MyClass。你可以在相同的文件夹下放置所有的PHP类文件,从字符串中提取命名空间,但那样会导致文件名冲突。

另外,你的类文件层次结构会按照命名空间的结构重新组织,例如,MyClass.php文件可以创建在/classes/App/Lib1文件夹下:

/classes/App/Lib1/MyClass.php

< ?php  namespace AppLib1;   class MyClass {   public function WhoAmI() {  return __METHOD__;   }  }  ?>  在根文件夹下的文件就使用下面的代码了:

myapp.php

< ?php  use AppLib1MyClass as MC;   $obj = new MC();  echo $obj->WhoAmI();   // autoload function  function __autoload($class) {   // convert namespace to full file path   $class = 'classes/' . str_replace('\', '/', $class) . '.php';   require_once($class);  }  ?>  解释:

1.类AppLib1MyClass的别名是MC;

2. new MC( )在编译时被翻译成new AppLib1MyClass( );

3.字符串AppLib1MyClass被传递给__autoload函数,使用文件路径正斜线替换所有命名空间中的反斜线,然后修改字符串,classesAppLib1MyClass.php文件被自动载入;

总结

有关PHP命名空间的使用就介绍到这里,希望您能够对PHP的命名空间有一个新的认识,并希望你能在新项目中真正使用命名空间。

 

[!--infotagslink--]

相关文章

  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • 解决vue的router组件component在import时不能使用变量问题

    这篇文章主要介绍了解决vue的router组件component在import时不能使用变量问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • Vue select 绑定动态变量的实例讲解

    这篇文章主要介绍了Vue select 绑定动态变量的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-23
  • 深入理解PHP变量的值类型和引用类型

    在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型,在使用的时候,需要注意这一点。看到网友在讨论PHP的&符号,要彻底理解它的用法,就有必要讨论一下变量的两种形式。PHP的变量在内存中是这样...2015-10-23
  • java中String类型变量的赋值问题介绍

    下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
  • vue+axios全局添加请求头和参数操作

    这篇文章主要介绍了vue+axios全局添加请求头和参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-24
  • C#不同类型的成员变量(字段)的默认值介绍

    虽然C#编译器为每个类型都设置了默认类型,但作为面向对象的设计原则,我们还是需要对变量进行正确的初始化。实际上这也是C#推荐的做法...2020-06-25
  • python 实现循环定义、赋值多个变量的操作

    这篇文章主要介绍了python 实现循环定义、赋值多个变量的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • 详解ES6实现类的私有变量的几种写法

    这篇文章主要介绍了详解ES6实现类的私有变量的几种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
  • C++变量,常量,数组和字符串详解

    这篇文章主要介绍了C++变量,常量,数组和字符串,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助...2021-10-21
  • vue设置全局访问接口API地址操作

    这篇文章主要介绍了vue设置全局访问接口API地址操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-14
  • 在JS中如何使用css变量详解

    这篇文章主要给大家介绍了关于如何在JS中如何使用css变量以及export之javascript关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2021-09-02
  • Nest.js环境变量配置与序列化详解

    这篇文章主要给大家介绍了关于Nest.js环境变量配置与序列化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-21
  • C#设置与获取环境变量的方法详解

    这篇文章主要给大家介绍了关于C#设置与获取环境变量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。...2020-06-25
  • 基于条件变量的消息队列 说明介绍

    本篇文章小编为大家介绍,基于条件变量的消息队列 说明介绍。需要的朋友参考一下...2020-04-25
  • Perl中的特殊内置变量详细介绍

    这篇文章主要介绍了Perl中的特殊内置变量详细介绍,需要的朋友可以参考下...2020-06-29
  • node.js 全局变量的具体使用

    这篇文章主要介绍了node.js 全局变量的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-15
  • 配置vue全局方法的两种方式实例

    vue项目中有一些方法需要在多个页面调用,但为了避免在每个页面都import进来,可以把方法加到原型上去,这样在每个组件中都能使用了,下面这篇文章主要给大家介绍了关于配置vue全局方法的两种方式,需要的朋友可以参考下...2021-09-13