php全局变量之学习笔记

 更新时间:2016年11月25日 15:00  点击:1884
今天我们参考php官方对php全局变量介绍来理解一下php全局变量一些用法与自己对它的一些思考吧,现在分享出来希望对各位同学有帮助。


一、核心要点思考:

1. 哪些全局变量是过期的及如何处理?
如:unset($GLOBALS, $_ENV, $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS, $HTTP_SERVER_VARS, $HTTP_ENV_VARS);
2.哪些全局变量有命令行下是无效的?
3. htmlspecialchars()用法, 为什么要用它?
4. $_REQUEST和 $_GET, $_POST,$_COOKIE的联系与区别?
5. 为什么上传了文件但$_FILES变量不存在或为空?
6. 全局变量的作用域?
7. 我想取得用户的IP和浏览器的user_agent信息, 如何取?
8. 我没有用浏览器, 我是 socket编程? 如何保持session?
9. 如何取得headers信息?


php九大全局预定义数组

超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量
$GLOBALS — 引用全局作用域中可用的全部变量
$_SERVER — 服务器和执行环境信息
$_GET — HTTP GET 变量
$_POST — HTTP POST 变量
$_FILES — HTTP 文件上传变量
$_REQUEST — HTTP Request 变量
$_SESSION — Session 变量
$_ENV — 环境变量
$_COOKIE — HTTP Cookies
$php_errormsg — 前一个错误信息
$HTTP_RAW_POST_DATA — 原生POST数据
$http_response_header — HTTP 响应头
$argc — 传递给脚本的参数数目
$argv — 传递给脚本的参数数组

二、主要问题
====================================

PHP基础篇总结题目:
1>. var_dump(0=="ads");请问该条语句结果是怎样的?为什么?
答:此语句结果为true;
此表达式中右侧的字符串默认强制转换为int数据0,与左侧数据相同,所以输出true,如果是“===”,则会输出false,这是因为他们类型不同,值也不同,在这里不会强制转换。

点评:这个真不好说, 测试一下吧! var_dump()打印表达式的结果! 这个实际考的是表达式运算。

2>.异常可以被克隆吗?
答:不可以。

3>.PHP中 Traits有什么特性?
答:Traits (横向重用/多重继承)是一组结构很像类的方法,但它但不能实例化,它可以让开发人员在不同的类中轻松地重用方法;
Traits的最佳应用是多类之间可以共享相同的函数;
静态变量可以被 trait 的方法引用,但不能被 trait 定义。但是 trait 能够为使用的类定义静态方法;
如果 trait 定义了一个属性,那类将不能定义同样名称的属性,否则会产生一个错误;

总结: 提的问题好,回答的也挺好

=====================================

1、有哪些超全局变量?答:超全局变量:$GLOBALS、$_SERVER、$_GET、$_POST、$_FILES、$_COOKIE、$_SESSION、$_REQUEST、$_ENV

2、浏览器把cookie给禁用了,$_SESSION还能用吗? 答:不能用了
点评: 答错了, 能用! apache有自动的功能将session_id放在get参数。

3、$php_errormsg在什么时候都可用吗?答:不是,这个变量只在错误发生的作用域内可用,并且要求track_errors配置项是开启的(默认是关闭的)。

总结: 很积极,回答能够在丰满一点比较好

 

========================================

有个人性化的面试问题
写30个php字符串函数。
例:
trim()      去掉字符串中的空格
chop()        从右向左,删除指定字符  ,参数  rtrim(string,find);
rtrim()     从右向左,删除指定字符  ,参数  rtrim(string,find);
chr()       返回字符的 asc2 码
var_dump()    打印一个值,可以是任何形式,并返回值的属性
print()        打印数组或字符串
print_r()     把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示
chunk_split()    把字符串分割为一连串更小的部分
implode()    把数组元素组合为一个字符串
join()        把数组元素组合为一个字符串
explode()    把字符串分割成数组
md5()        返回一个md5值,不可逆
strlen()    获取一个字符串的长度
str_replace    替换字符串中的一些字符
mb_substr    mb扩展的截取字符串函数,格式:mb_substr(string,start_Num,end_Num,'utf-8')
str_split     将一个字符串按照字符间距分割为一个数组
strpos         查找并返回首个匹配项的位置
strtr        转换字符串中特定的字符
substr         对字符串进行截取
substr_count     计算字符串中某字符段的出现次数
substr_replace  对字符串中的部分字符进行替换
wordwrap    函数按照指定长度对字符串进行折行处理
addcslashes()    在指定的字符前添加反斜杠
strtolower()    把字符串转换为小写
strtoupper()    把字符串转换为大写
strrev()    反转字符串
strripos()    查找字符串在另一字符串中最后出现的位置(大小写不敏感)
strrpos()    查找字符串在另一字符串中最后出现的位置(大小写敏感)
strspn()    返回在字符串中包含的特定字符的数目
ucwords()    把字符串中每个单词的首字符转换为大写
str_repeat()    把字符串重复指定的次数
...

=======================================

1、命名空间必须是程序脚本的第一条语句吗?
答案:yes

2、如何取消引用?
答案:unset();

3、如果一个类,它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象类吗?继承一个抽象类的时候,子类必须定义父类中的所有抽象方法吗?
答案:如果一个类中有抽象方法,类必须定义为抽象类,继承一个抽象类时,子类必须定义父类中的所有抽象方法。

========================================

1.如何得到文件的绝对路径
使用realpath() 函数,返回绝对路径名。若失败,则返回 false,比如说文件不存在。
echo realpath("test.txt");
输出:
C:wwwtestwebtest.txt

2.session的工作原理
session保存在服务端,但会以cookie的形式保存在客户端一个sessionid,如果禁用cookie,就需要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现。

点评: 是这个原理, 但一般有web服务器会自动完成这个功能, 不需要在程序中添加。

3.public static声明的函数是静态方法吗?
public static声明的函数是静态方法,可以直接在类外用,类名::函数名的方法调用 不用采用NEW声明的方式
注意:函数内不能有动态内容 如$this->之类的
一般来说 需要频繁执行的内容 用STATIC声明

总结: session的工作原理整理的很好,分析很透彻。希望以后积极点,继续努力

在php中数组与变量相互转换我们可使用到extract或compact函数哦,下面我来给大家利用这两个函数来分享两个实例吧。

compact 多个变量转数组

 代码如下 复制代码

<?php
    //多个变量转数组
    $name='phpff';
    $email='phpff@phpff.com';
    $info=compact('name','email');//传递变量名
    print_r($info);
    /*
    Array
    (
        [name] => phpff
        [email] => phpff@phpff.com
    )
    */
?>

extract 数组转多个变量

 代码如下 复制代码

<?php
//数组转多个变量
    $capitalcities['England'] = 'London';
    $capitalcities['Scotland'] = 'Edinburgh';
    $capitalcities['Wales'] = 'Cardiff';
    extract($capitalcities);//转变成三个变量 England,Scotland,Wales
    print $Wales;//Cardiff

?>

 代码如下 复制代码

<?php
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "$a = $a; $b = $b; $c = $c";
?>

结果

$a = Cat; $b = Dog; $c = Horse

在php中我要销毁变量并内存释规范的写法就是直接使用unset()函数了,但是我们测试会发现unset只是当指向该值的所有变量(比如有引用变量指向该值)都被销毁后,地址才会被释放,下面我们来看几个实例。

首先我们来看一个例子:

 代码如下 复制代码

<?php
    $a = "hello springload";
    $b = $a;
    unset($b);
    echo $a; //hello springload
?>

这个我们很清楚,unset($b),只是断开了变量名和值得绑定,但是一个有意思的问题出现了:

 代码如下 复制代码

<?php
    $a = "hello springload";
    $b = $a;
    unset($a);
    echo $b;//hello springload
?>

为什么$a销毁了,为嘛$b的值还在呢?

注:unset()函数只有当指向该值的所有变量(比如有引用变量指向该值)都被销毁后,地址才会被释放,如下:

 代码如下 复制代码

<?php
    $a = "hello springload";
    $b = $a;
    unset($a);
    unset($b);
    echo $b;//输出空
?>

在php中开启与关闭错误提示的方法有几种一种可以直接在程序中使用相关函数来开户,另一种我们可以使用php.ini中配置参数来控制,下面小编来给各位同学介绍一下。

windows系统开关php错误提示

如果不具备修改php.ini的权限,可以将如下代码加入php文件中:

 代码如下 复制代码

ini_set("display_errors", "On");

error_reporting(E_ALL | E_STRICT);

当然,如果能够修改php.ini的话,如下即可:

 代码如下 复制代码

找到display_errors = On 修改为 display_errors = off

注意:如果你已经把PHP.ini文件复制到windows目录下,那么必须同时把c:windows/php.ini里的display_errors = On 修改为display_errors = off

PHP .ini中display_errors = Off失效的解决


在linux系统中开启与关闭错误提示方法差不多,不过我还是具体给大家介绍一下

linux系统下

1. 打开php.ini文件。

以我的ubuntu为例,这个文件在: /etc/php5/apache2 目录下。

2. 搜索并修改下行,把Off值改成On

 代码如下 复制代码
display_errors = Off

3. 搜索下行

 代码如下 复制代码
error_reporting = E_ALL & ~E_NOTICE
或者搜索:
error_reporting = E_ALL & ~E_DEPRECATED
修改为
error_reporting = E_ALL | E_STRICT

4. 修改Apache的 httpd.conf,

以我的 Ubuntu 为例, 这个文件在:/etc/apache2/  目录下,这是一个空白文件。
添加以下两行:

 代码如下 复制代码

php_flag display_errors        on
php_value error_reporting       2039

5. 重启Apache,就OK了。

重启命令: :

 代码如下 复制代码
sudo /etc/init.d/apache2 restart
在php中静态方法我们就直接在函数或变量前加一个static就可以了,使用的时候和静态变量差不多,不需要实例化,直接用::调用了,下面我来给大家举几个关于静态方法实例。

PHP也不例外!所谓静态方法(属性)就是以static关键词标注的属性或者方法(例如:静态属性public static username;)
静态方法和非静态方法最大的区别在于他们的生命周期不同,用一个实例来说明

静态方法定义

定义静态方法很简单,在声明关键词function之前加上static,例如:

 代码如下 复制代码

class A
{
    static function fun()
    {
        // do somathing
    }
}

静态方法使用

使用的时候和静态变量差不多,不需要实例化,直接用::调用,例如:

 代码如下 复制代码

A::fun()

对比普通方法
因为静态方法的调用不需要实例化,所以在静态方法中引用类自身的属性或者方法的时候会出错,也就是形如self和$this是错误的。

 代码如下 复制代码

class MyClass
{
    public $num = 5;

    function __construct()
    {
        $this->num = 10;
    }

    function fun_1()
    {
        echo "I am a public method named fun_1.n";
        echo "The num of object is {$this->num}.n";
    }

    static function fun_2()
    {
        echo "I am a static method named fun_2.n";
    }

    function fun_3($n)
    {
        echo "The arg is {$n}n";
    }
}

$m = new MyClass;
$m->fun_1();
$m->fun_2();
$m->fun_3('test');

MyClass::fun_1();
MyClass::fun_2();
MyClass::fun_3('test');

输出结果:

lch@localhost:php $ php class_method.php
I am a public method named fun_1.
The num of object is 10.
I am a static method named fun_2.
The arg is test
I am a public method named fun_1.
PHP Fatal error:  Using $this when not in object context in /Users/lch/program/php/class_method.php on line 14

再看一实例

用一个实例来说明。

 代码如下 复制代码

class user{
public static $username;   //声明一个静态属性
public $password;     //声明一个非静态属性

function __construct($pwd) {
  echo ‘Username:’,self::$username;   //输出静态属性
 
  self::$username = ‘admin’;  //为静态属性赋值
  $this->password = $pwd;   //为非静态属性赋值
}

public function show(){    //输出类属性
  echo ‘
Username:’,self::$username;
  echo ‘
Password:’,$this->password;
}

public static function sshow(){
  echo ‘
Username:’,self::$username;
  echo ‘
Password:’,$this->password;
}
}
user::$username = ‘root’;    //为赋值user类的静态属性赋值
$objUser = new user(’123456′);     //实例化user类
$objUser->sshow();
unset($objUser);
echo ‘
Username:’,user::$username;

/*
* 输出结果为:
* Username:root
* Username:admin
* Password:123456
* Usern
ame:admin
* */

从这里实例中可以看出,静态属性在类实例化以前就起作用了,并且在对象被销毁时静态属性依然可以发挥作用!
也因为静态方法的这种属性,所以不能在静态方法中调用非静态属性或者方法

接着看

1、php类中,假设所有的属性与方法的可见性为public,那么在外部访问类的方法或属性时,都必须通过对象【类的实例化过程】来调用。

eg:

 代码如下 复制代码

class Log
{
    public $root = DIRECTORY_SEPARATOR;
    public $logPath = '/data/app/www/test-realtime.monitoring.c.kunlun.com/log';
    public $defaultDir = 'default';
   
    public function writeLog($logName, $logType, $data, $newDir = FALSE)
    {
        $fileName = '';
       
        if (!file_exists($this->logPath))
        {
            mkdir($this->logPath, 0777);
        }
       
        if ($newDir !== FALSE)
        {
            @mkdir($this->logPath.$this->root.$newDir, 0777);
            $fileName = $this->logPath.$this->root.$newDir.$this->root.date('Y-m-d', time()).'_'.$logName.'_'.$logType.'.log';
        }
        else
        {
            @mkdir($this->logPath.$this->root.$this->defaultDir, 0777);
            $fileName = $this->logPath.$this->root.$this->defaultDir.$this->root.date('Y-m-d', time()).'_'.$logName.'_'.$logType.'.log';
        }
       
        file_put_contents($fileName, date('Y-m-d H:i:s').' '.$data."n", FILE_APPEND);
    }
}


类的实例化对象的过程:$logObj = new Log();

访问类中的方法:$logObj->writeLog($param1, $param2, $param3, $param4);

访问类中的属性:echo $logObj->root;

2、如果类中的属性前被static关键字修饰时,就不能通过对象来访问被static修饰的属性,但如果是类中的方法被static修饰时则即可以通过对象也可以通过类名::方法名的方式来进行访问。

3、如果类中的方法被static修饰则,方法中不能用$this,$this指的是类的实例化对象,由于静态方法不用通过对象就可以调用,所以伪变量$this不可用。

[!--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
  • C#不同类型的成员变量(字段)的默认值介绍

    虽然C#编译器为每个类型都设置了默认类型,但作为面向对象的设计原则,我们还是需要对变量进行正确的初始化。实际上这也是C#推荐的做法...2020-06-25
  • php上传图片学习笔记与心得

    我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
  • Smarty模板学习笔记之Smarty简介

    1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
  • 详解ES6实现类的私有变量的几种写法

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

    这篇文章主要介绍了python 实现循环定义、赋值多个变量的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • Nest.js环境变量配置与序列化详解

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

    这篇文章主要介绍了C++变量,常量,数组和字符串,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助...2021-10-21
  • 在JS中如何使用css变量详解

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

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

    当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
  • 轻松理解Javascript变量的相关问题

    这篇文章主要给大家介绍了关于Javascript变量的相关问题,文中给出了详细的介绍和示例代码,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。...2017-01-23
  • 基于条件变量的消息队列 说明介绍

    本篇文章小编为大家介绍,基于条件变量的消息队列 说明介绍。需要的朋友参考一下...2020-04-25
  • node.js 全局变量的具体使用

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