PHP的基本常识小结


Posted in PHP onJuly 05, 2013

这些PHP的概念,有些刚开始比较难懂,很难理解,我把他们都列出来,希望能帮助一些人,在前进的路上少点荆棘。

1. variable variables(变量的变量)

variable_variables.php

<?php
$a = 'hello';
$hello = 'hello everyone';
echo $$a.'<br />';
$b = 'John';
$c = 'Mary';
$e = 'Joe';
$students = array('b','c','e');
echo ${$students[1]};
/*
foreach($students as $seat){
    echo $$seat.'<br />';
}
 $$var[1]
 ${$var[1]} for #1
*/

$a = 'hello';

将hello 赋值给 变量 $a, 于是 $$a = ${hello} = $hello = 'hello everyone';

如果对于 $$students[1],  这样会产生混乱,php的解释器可能无法理解,‘[' 虽然有较高运算符,但结果可能无法输出。

好的写法是:${$students[1]} = ‘Mary';

2. array's function(数组函数)

 array_functions.php

<?php
echo '<p>shift & unshift </p>';
$numbers = array(1,2,3,4,5,6);
print_r($numbers);
echo '<br />';
// shifts first elemnt out of an array
// the index will reset
$a = array_shift($numbers);
echo 'a: '.$a.'<br />';
print_r($numbers);
// push element to the front of array
// returns the count of array and reset array index
$b = array_unshift($numbers, 'first');
echo '<br />b: '.$b.'<br />';
print_r($numbers);
echo '<hr />';
echo '<p>pop & push </p>';
// pop the last element out of array
$c = array_pop($numbers);
print_r($numbers);
echo '<br />';
// push the element to the last of array
$d = array_push($numbers, 'last');
echo 'd: '.$d.'<br />';
print_r($numbers);

更多数组函数参考

3. dates and times (时间和日期)

有3种方法可以创建一个unix time(从1970/1/1 到现在的秒数)

time(); 返回当前的时间戳

mktime($hr, $min, $sec, $month, $day, $year); mktime(6,30,0,5,22,2012) 返回2012 5/22 6:30:00 的时间戳

strtotime($string); strtotime("+1 day") 返回明天这个时候的时间戳 更多 'last Monday' 'lasy Year'

checkdate($month, $day, $year); 验证一个日期是否为真 checkdate(5,32,2012) ? 'true' : 'false'; // return false

得到了时间戳后,我们需要对它进行转化为可读的,如2012/5/22

我们有2种方法 date($format, $timestamp) ; strftime($format [,$timestamp])

推荐用第2种,strftime("%Y-%m-%d %H:%M:%S"); // return 2012-05-22 15:46:40

更多时间日期参考

5. server variables (服务器和执行环境信息)

$_SERVER

server_variables.php

<?php echo 'SERVER details:<br />'; 
echo 'SERVER_NAME: '.$_SERVER['SERVER_NAME'].'<br />'; 
echo 'SERVER_ADD: '.$_SERVER['SERVER_ADDR'].'<br />'; 
echo 'SERVER_PORT: '.$_SERVER['SERVER_PORT'].'<br />'; 
echo 'DOCUMENT_ROOT: '.$_SERVER['DOCUMENT_ROOT'].'<br />'; 
echo '<br />'; 
echo 'Page details:<br />'; 
echo 'REMOTE_ADDR: '.$_SERVER['REMOTE_ADDR'].'<br />'; 
echo 'REMORT_PORT: '.$_SERVER['REMOTE_PORT'].'<br />'; 
echo 'REQUEST_URI: '.$_SERVER['REQUEST_URI'].'<br />'; 
echo 'QUERY_STRING: '.$_SERVER['QUERY_STRING'].'<br />'; 
echo 'REQUEST_METHOD: '.$_SERVER['REQUEST_METHOD'].'<br />'; 
echo 'REQUEST_TIME: '.$_SERVER['REQUEST_TIME'].'<br />'; 
echo 'HTTP_USER_AGENT: '.$_SERVER['HTTP_USER_AGENT'].'<br />'; 
echo '<br />';

更多详细信息

6.variable_scope(变量的作用域 global static)

static_variables.php

<?php
function test()
{
    $a = 0;
    echo $a;
    $a++;
}
test();
echo '<br />';
test();
echo '<br />';
test();
echo '<br />';
echo '<hr />';
function test1()
{
    static $a = 0;
    echo $a;
    $a++;
}
test1();
echo '<br />';
test1();
echo '<br />';
test1();
echo '<br />';

test() 函数中的变量 $a 没有保存 $a++ 的结果 , 重复调用test() 并没有使 $a 的值增加

而test1() 函数中 变量 $a 申明了 staic $a = 0, 为静态变量。

引用:A static variable exists only in a local function scope, but it does not lose its value when program execution leaves this scope.

一个静态变量 只能存在于本地的函数作用域内 也就是test1() 函数体内, 但是当程序离开这个test1() 作用域时,静态变量不会失去它的值,也就是 $a 变量会增加 1; 当重新调用 test1() 时,$a = 1;

global_variables.php

<?php
$a = 1;
$b = 2;
function Sum()
{
    global $a, $b;
    $b = $a + $b;
} 
Sum();
echo $b;
echo '<hr />';
$a = 1;
$b = 2;
function Sum1()
{
    $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
} 
Sum1();
echo $b;

引用:In PHP global variables must be declared global inside a function if they are going to be used in that function

如果这些变量将在函数中使用,全局变量必须在使用的那个函数中进行定义。 这样可以避免很多麻烦。

更多详细信息

7.reference(引用)

variable_reference.php

<?php 
$a = 'arist'; 
$b = $a; 
$b = 'ming'; 
echo "My name is:{$a}. But my mother call me {$b}.<br />"; echo '<hr />'; 
$a = 'arist'; 
$b = &$a; 
$b = 'ming'; 
echo "My name is:{$a}. And my mother call me {$b}.<br />";

这个概念可以这样理解,我妈叫我明明,但是我的领导会叫我小言;不管是明明或者是小言,都是我。
'&' 而这个就是不同的人叫我们的别名的方法 即引用,相当于 $a = {我,或者内存中的值} , $b = {领导,妈妈,或者变量}
通过 & , $b指向了$a 在内存中唯一也是相同的值。 所以不管你领导叫你什么,或者你妈叫你什么,你都是你。只是称呼不同。

所以通过引用后, 我们改变$b的值,同时也改变了$a的值。

8. pass reference variable to function(传递引用参数给函数)

<?php 
function ref_test(&$var){ 
return $var *= 2; 
} $a = 10; 
ref_test($a); 
echo $a;

当我们按引用传递参数给函数时,我们传递地不是变量的副本(copy) ,而是真实的值,

所以当我们调用函数ref_test($a)的时候已经改变了 $a 的值, 所以最后 $a = 20;

9. reference function return value(引用函数的返回值)

reference_function_return_value.php

<?php 
function &increment(){ 
static $var = 0; 
$var++; 
return $var; 
} $a =& increment(); // 1 
increment(); // 2 
$a++; //3 
increment(); // 4 
echo "a: {$a}";

首先申明一个引用函数,在函数体内,申明一个静态变量 $var, 可以保存增加的值;

$a =& increment(); 这条语句是 变量$a 引用 函数increment() 的返回值,

和前面的引用变量一样, 你可以把increment()函数, 看作是一个变量; 这样就变为 $a = & $b;

所以increment() 和 $a 都指向同一个值,改变任何一个,都能改变同一个值。

更多详细信息

对象 OOP

1.Fatal error: Using $this when not in object context

这个错误刚学 OOP 肯定容易出现,因为有个概念你没有真正理解。 类的可访问性(accessible),也可以说是作用域, 你还可以认为是 1个 中国人 在国外,他不属于哪个文化,他不讲外语(可能他知道点);但是他无法通过自己跟老外沟通,因为他们不是在一个共同国度出生。
那么错误是如何发生的呢?看下面的例子:

<?php
 class Trones{
     static public $fire = "I am fire.";
      public $water = "I am water";     static function getFire( ) {
         return $this->fire ; // wrong
     }
     static function getWater( ) {
         return $self::water ;  // wrong 
     }
     static function Fire( ) {
         return self::$fire ;  // be sure you use self to access the static property before you invoke the function
     }
 }
 /*
 Fatal error: Using $this when not in object context
 */
 //echo Trones::getFire( ) ;
 //echo Trones::getWater( ) ;
 // correct
 echo Trones::Fire( );
 echo "<br />" ;
 $trones = new Trones ;
 $trones->fire ; // Notice: Undefined property: Trones::$fire (base on defferent error setting) simple is error
 echo Trones::$fire ;

这个错误很经典, 也很实用,先看 static 的定义:

Declaring class properties or methods as static makes them accessible without needing an instantiation of the class. A property declared as static can not be accessed with an instantiated class object (though a static method can).

翻译:定义一个类的属性或方法为静态时,可以使他们在不需要初始化一个类时就能直接访问 。一个被定义为了静态的属性不能被类的对象用对象操作符访问* -> *,(可以通过静态的方法访问)。

例子说明:
7行 10行 犯了同一个错误,第一个是用对象操作符来访问静态变量。你看看定义,$this 是一个伪变量 相当于 object,一个实例。你用对象操作符 -> 访问就会报错。

同样你也不能用 静态操作符 :: 来访问一个公共变量 。 正确的访问应该是 14行 25行,一个是在类的定义里访问(self:: === Trones::),一个是在类的外部访问。

对于继承类,以上的规则同样适合。

2.Fatal error: Call to private method

最近有部连续剧很好看,叫权利的游戏,我们假设有 3方人马, 7个国王, 平民, 龙女。 他们三方人马在下面争夺最终的胜利, 也就是王冠。

下面的故事还有一个标题:类的可见性(visibility) 你如果知道最终的答案,解释部分你可以略过了。

<?php 
 class Trones {
     protected $fire = " fire ";
     public $water = " water " ;
     static private $trones  = "Trones";     protected function getFire( ) {
         $this->fire ;
     }
     static public function TheDragenOfMather( ) {
         return __METHOD__." use ".$this->getFire()." gets the ".self::getTrones( ) ;
     }
     static public function getWater( ) {
         return __METHOD__ ;
     }
     static private function getTrones( ) {
         return  self::$trones ;
     }
 }
 class Kings extends Trones {
     static function TheSevenKing( ) {
         return __METHOD__."gets the ".self::getTrones( );
     }
 }
 class People extends Trones{
     static function ThePeople( ) {
         return __METHOD__."gets the ".self::getTrones( );
     }
 }
 echo Kings::TheSevenKing( ) ;
 echo Trones::TheDragenOfMather( ) ;
 echo People::ThePeople( ) ;

正确答案是:7国征战 内斗,平民死伤无数,龙女想乘机渔翁得利;可惜 最终谁也没有得到皇冠和胜利。哈哈。

当static 碰到 private ,结合产生复杂,也产生美;就像抽象的人,像我们大学老师讲的数学课;(不过网易的公开数学课很好)

如果想要龙女 获得最后的胜利, 你只要帮她一把 将13行的 $this->getFire() 这部分去掉就可以了。同样的道理 你无法在一个静态函数里 使用任何对象操作符。

怎么使人民获得王冠呢? 你去奋斗吧!

如果你不构建大型的框架和网站 这些概念比如 Interface Implement abstract 。。。 你还是不知道的好。

PHP 相关文章推荐
提升PHP执行速度全攻略(下)
Oct 09 PHP
图书管理程序(一)
Oct 09 PHP
支持php4、php5的mysql数据库操作类
Jan 10 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Mar 31 PHP
探讨PHP调用时间格式的参数详解
Jun 06 PHP
php截取中文字符串不乱码的方法
Dec 25 PHP
php的XML文件解释类应用实例
Sep 22 PHP
thinkphp实现like模糊查询实例
Oct 29 PHP
php利用cookie实现自动登录的方法
Dec 10 PHP
PHP引用返回用法示例
May 28 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
PHP实现的多维数组去重操作示例
Jul 21 PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 #PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 #PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 #PHP
php记录代码执行时间(实现代码)
Jul 05 #PHP
如何修改和添加Apache的默认站点目录
Jul 05 #PHP
解析php类的注册与自动加载
Jul 05 #PHP
php 注册时输入信息验证器的实现详解
Jul 05 #PHP
You might like
PHP新手上路(四)
2006/10/09 PHP
常用的php对象类型判断
2008/08/27 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
2018/04/27 PHP
jquery 表单进行客户端验证demo
2009/08/24 Javascript
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
JavaScript事件委托实例分析
2015/05/26 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
2017/02/22 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
JS+HTML5 FileReader对象用法示例
2017/04/07 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
用Fundebug插件记录网络请求异常的方法
2019/02/21 Javascript
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
浅谈python中的占位符
2017/11/09 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
python将回车作为输入内容的实例
2018/06/23 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
2018/09/25 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
python如何爬取网页中的文字
2020/07/28 Python
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
幼儿园教育教学反思
2014/01/31 职场文书
2014年教师政治学习材料
2014/06/02 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
公司董事任命书
2015/09/21 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers