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 相关文章推荐
MySQL数据源表结构图示
Jun 05 PHP
PHP 危险函数全解析
Sep 09 PHP
用php实现的下载css文件中的图片的代码
Feb 08 PHP
注册页面之前先验证用户名是否存在的php代码
Jul 14 PHP
PHP小技巧之函数重载
Jun 02 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
给ECShop添加最新评论
Jan 07 PHP
简单解决新浪SAE无法上传文件的问题
May 13 PHP
php实现基于openssl的加密解密方法
Sep 30 PHP
php 魔术常量详解及实例代码
Dec 04 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 PHP
PHP生成随机密码4种方法及性能对比
Dec 11 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中的事务使用实例
2015/05/26 PHP
php实现多城市切换特效
2015/08/09 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
完整显示当前日期和时间的JS代码
2007/09/17 Javascript
jquery text()要注意啦
2009/10/30 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
jquery修改属性值实例代码(设置属性值)
2014/01/06 Javascript
JavaScript验证电子邮箱的函数
2014/08/22 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
2015/04/07 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
javascript常用的方法整理
2015/08/20 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
2018/01/02 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
使用Promise封装小程序wx.request的实现方法
2019/11/13 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
2020/12/14 Vue.js
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
详解Python中最难理解的点-装饰器
2017/04/03 Python
python测试mysql写入性能完整实例
2018/01/18 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
阿玛尼美妆俄罗斯官网:Giorgio Armani Beauty RU
2020/07/19 全球购物
经营管理策划方案
2014/05/22 职场文书
高三毕业评语
2014/12/31 职场文书
工程部岗位职责范本
2015/04/11 职场文书
春晚观后感
2015/06/11 职场文书
汉语拼音教学反思
2016/02/22 职场文书
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers