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
用PHP 快速生成 Flash 动画的方法
Mar 06 PHP
set_include_path在win和linux下的区别
Jan 10 PHP
php 一元分词算法
Nov 30 PHP
PHP 巧用数组降低程序的时间复杂度
Jan 01 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
Sep 30 PHP
解密ThinkPHP3.1.2版本之模板继承
Jun 19 PHP
destoon实现商铺管理主页设置增加新菜单的方法
Jun 26 PHP
php使用指定编码导出mysql数据到csv文件的方法
Mar 31 PHP
Yii2增加验证码步骤详解
Apr 25 PHP
CI框架无限级分类+递归的实现代码
Nov 01 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 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中的Session和Cookie
2013/06/21 PHP
php多用户读写文件冲突的解决办法
2013/11/06 PHP
使用php清除bom示例
2014/03/03 PHP
PHP向浏览器输出内容的4个函数总结
2014/11/17 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
PHP学习记录之数组函数
2018/06/01 PHP
基于jquery &amp; json的省市区联动代码
2012/06/26 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
深入解析JavaScript中的变量作用域
2013/12/06 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
基于多进程中APScheduler重复运行的解决方法
2019/07/22 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
2020/05/07 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
员工评语大全
2014/01/19 职场文书
家长给小学生的评语
2014/01/30 职场文书
房地产财务管理制度
2014/02/02 职场文书
酒店开业策划方案
2014/06/02 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
小学优秀学生评语
2014/12/29 职场文书
MySQL触发器的使用
2021/05/24 MySQL
一篇文章带你复习java知识点
2021/06/28 Java/Android
【海涛七七解说】DCG第二周:DK VS 天禄
2022/04/01 DOTA
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby