php 语言总结

php 语言总结:基础语法 类型  常量 运算符  流程控制  函数 类与对象 命名空间  超全局变量  垃圾回收机制

1 基本语法

*php标记

<?php

echo "Hello world";

// ... more code

echo "Last statement";

// 脚本至此结束,并无 PHP 结束标记

注意:如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。

这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,

而脚本中此时并无输出的意图。

*从html中分离

<?php if ($expression == true): ?>

This will show if the expression is true.

<?php else: ?>

Otherwise this will show.

<?php endif; ?>

2 类型

*简介

PHP 支持 8 种原始数据类型。

四种标量类型:

boolean(布尔型)

integer(整型)

float(浮点型,也称作 double)

string(字符串)

两种复合类型:

array(数组)

object(对象)

最后是两种特殊类型:

resource(资源)

NULL(无类型)

Note:查看表达式的值和类型,用 var_dump() 函数,获取类型用gettype(),判断是否为某个类型is_type()

*boolean

要指定一个布尔值,使用关键字 TRUE 或 FALSE。两个都不区分大小写

当转换为 boolean 时,以下值被认为是 FALSE:

布尔值 FALSE 本身

整型值 0(零)

浮点型值 0.0(零)

空字符串,以及字符串 "0"

不包括任何元素的数组

<?php

var_dump((bool) "");        // bool(false)

var_dump((bool) 1);         // bool(true)

var_dump((bool) -2);        // bool(true)

var_dump((bool) "foo");     // bool(true)

var_dump((bool) 2.3e5);     // bool(true)

var_dump((bool) array(12)); // bool(true)

var_dump((bool) array());   // bool(false)

var_dump((bool) "false");   // bool(true)

?>

*integer

最大值可以用常量 PHP_INT_MAX 来表示

*float

*string

单引号:不会解析里面的变量

双引号:会解析里面的变量

(如果没有变量那么建议使用单引号这样效率会更高点,因为不用解析里面的内容)

复杂(花括号):只需简单地像在 string 以外的地方那样写出表达式,然后用花括号 { 和 } 把它括起来即可

<?php

// 有效,当在字符串中使用多重数组时,一定要用括号将它括起来

echo "This works: {$arr[‘foo‘][3]}";

// 有效

echo "This works: " . $arr[‘foo‘][3];

?>

*array

<?php

// 创建一个简单的数组

$array = array(1, 2, 3, 4, 5);

print_r($array);

// 现在删除其中的所有元素,但保持数组本身不变:

foreach ($array as $i => $value) {

unset($array[$i]);

}

print_r($array);

//删除整个数组unset($array)

?>

*object

要创建一个新的对象 object,使用 new 语句实例化一个类:

<?php

class foo

{

function do_foo()

{

echo "Doing foo.";

}

}

$bar = new foo;

$bar->do_foo();

?>

*resource

像数据库连接就会返回一个资源

*null

NULL 类型只有一个值,就是不区分大小写的常量 NULL。

在下列情况下一个变量被认为是 NULL:

被赋值为 NULL。

尚未被赋值。

被 unset()。

判断是否为null,使用is_null()

2 变量

*基础

$this 是一个特殊的变量,它不能被赋值

变量默认总是传值赋值,也有引用变量,这就意味着改动新变量将影响到原始的变量

*预定义变量

*变量范围

在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内

<?php

$a = 1; /* global scope */

function Test()

{

echo $a; /* reference to local scope variable */

}

Test();

?>

和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖。

PHP 中全局变量在函数中使用时必须声明为 global

<?php

$a = 1;

$b = 2;

function Sum()

{

global $a, $b;

$b = $a + $b;

}

Sum();

echo $b;

?>

态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失

<?php

function test()

{

static $a = 0;

echo $a;

$a++;

}

?>

*可变变量

<?php

$a = ‘hello‘;

$$a = ‘world‘;

echo "$a ${$a}";

//与以下语句输出完全相同的结果:

echo "$a $hello";

?>

*来自php之外的变量

$_POST $_GET

3 常量

<?php

// 合法的常量名

define("FOO",     "something");

define("FOO2",    "something else");

define("FOO_BAR", "something more");

// 非法的常量名

define("2FOO",    "something");

// 下面的定义是合法的,但应该避免这样做:(自定义常量不要以__开头)

// 也许将来有一天PHP会定义一个__FOO__的魔术常量

// 这样就会与你的代码相冲突

define("__FOO__", "something");

?>

4 运算符

*优先级

<?php

$a = 3 * 3 % 5; // (3 * 3) % 5 = 4

$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2

$a = 1;

$b = 2;

$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5

// mixing ++ and + produces undefined behavior

$a = 1;

echo ++$a + $a++; // may print 4 or 5

?>

*错误运算符

支持一个错误控制运算符:@,该表达式可能产生的任何错误信息都被忽略掉。

*执行运算符

注意这不是单引号!PHP 将尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回

使用反引号运算符“`”的效果与函数 shell_exec() 相同。

<?php

$output = `ls -al`;

echo "<pre>$output</pre>";

?>

结果:将文件目录结构输出来

*字符串连接运算符

有两个字符串(string)运算符。第一个是连接运算符(“.”),它返回其左右参数连接后的字符串。

第二个是连接赋值运算符(“.=”),它将右边参数附加到左边的参数之后

<?php

$a = "Hello ";

$b = $a . "World!"; // now $b contains "Hello World!"

$a = "Hello ";

$a .= "World!";     // now $a contains "Hello World!"

?>

*数组运算符

$a + $b 联合
$a 和 $b 的联合。

$a == $b 相等
如果 $a 和 $b 具有相同的键/值对则为 TRUE。

$a === $b 全等
如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。

$a != $b 不等
如果 $a 不等于 $b 则为 TRUE。

$a <> $b 不等
如果 $a 不等于 $b 则为 TRUE。

$a !== $b 不全等
如果 $a 不全等于 $b 则为 TRUE。

+ 运算符把右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只用左边数组中的,右边的被忽略。

<?php

$a = array("a" => "apple", "b" => "banana");

$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");

$c = $a + $b; // Union of $a and $b

echo "Union of \$a and \$b: \n";

var_dump($c);

$c = $b + $a; // Union of $b and $a

echo "Union of \$b and \$a: \n";

var_dump($c);

?>

数组中的单元如果具有相同的键名和值则比较时相等

<?php

$a = array("apple", "banana");

$b = array(1 => "banana", "0" => "apple");

var_dump($a == $b); // bool(true)

var_dump($a === $b); // bool(false)

?>

*类型运算符

instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例

<?php

class MyClass

{

}

class NotMyClass

{

}

$a = new MyClass;

var_dump($a instanceof MyClass);

var_dump($a instanceof NotMyClass);

?>

五:流程控制

*if else

*流程控制代替语法

PHP 提供了一些流程控制的替代语法,包括 if,while,for,foreach 和 switch。

替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成

endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。

<?php if ($a == 5): ?>

A is equal to 5

<?php endif; ?>

*while

while (expr):

statement

...

endwhile;

* for

<?php

$people = Array(

Array(‘name‘ => ‘Kalle‘, ‘salt‘ => 856412),

Array(‘name‘ => ‘Pierre‘, ‘salt‘ => 215863)

);

for($i = 0, $size = sizeof($people); $i < $size; ++$i)

{

$people[$i][‘salt‘] = rand(000000, 999999);

}

?>

*foreach

可以很容易地通过在 $value 之前加上 & 来修改数组的元素。

此方法将以引用赋值而不是拷贝一个值。

<?php

$arr = array(1, 2, 3, 4);

foreach ($arr as &$value) {

$value = $value * 2;

}

// $arr is now array(2, 4, 6, 8)

unset($value); // 最后取消掉引用

?>

*require 和 include

require 出错是会停止脚本程序,include 会产生警告

require_once和require 基本一样,唯一的区别是唯一区别是 PHP 会检查该文件是否

已经被包含过,如果是则不会再次包含。

六 函数

*可变函数

可变函数类似于可变变量

这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。

可变函数可以用来实现包括回调函数,函数表在内的一些用途

<?php

function foo() {

echo "In foo()<br />\n";

}

function bar($arg = ‘‘) {

echo "In bar(); argument was ‘$arg‘.<br />\n";

}

// 使用 echo 的包装函数

function echoit($string)

{

echo $string;

}

$func = ‘foo‘;

$func();        // This calls foo()

$func = ‘bar‘;

$func(‘test‘);  // This calls bar()

$func = ‘echoit‘;

$func(‘test‘);  // This calls echoit()

?>

*匿名函数

<?php

echo preg_replace_callback(‘~-([a-z])~‘, function ($match) {

return strtoupper($match[1]);

}, ‘hello-world‘);

// 输出 helloWorld

?>

七 类与对象

*基本概念

$this 是一个到主叫对象的引用(通常是该方法所从属的对象)

*属性

在类的成员方法里面,可以用 ->(对象运算符):$this->property(其中 property 是该属性名)这种方式来访问非静态属性。

静态属性则是用 ::(双冒号):self::$property 来访问。更多静态属性与非静态

*类常量

可以把在类中始终保持不变的值定义为常量

<?php

class MyClass

{

const constant = ‘constant value‘;

}

?>

*自动加载类

*Static 静态关键字

声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)

因为静态方法在编译前就被加载了,所有就不能访问非静态方法,因为他们还不存在

*抽象类

任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的

*接口

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

*traits

Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。

Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;

也就是说,应用类的成员不需要继承。

<?php

trait ezcReflectionReturnInfo {

function getReturnType() { /*1*/ }

function getReturnDescription() { /*2*/ }

}

class ezcReflectionMethod extends ReflectionMethod {

use ezcReflectionReturnInfo;

/* ... */

}

class ezcReflectionFunction extends ReflectionFunction {

use ezcReflectionReturnInfo;

/* ... */

}

?>

*遍历对象

*final关键字

如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。

*对象复制

*对象比较

当使用比较运算符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值 都相等,

而且两个对象是同一个类的实例,那么这两个对象变量相等。

而如果使用全等运算符(===),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)。

*后期静态绑定

*对象和引用

一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。下面通过一些例子来说明。

*对象系列化

所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。

序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字

八 命名空间

*命名空间概述

用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。

<?php

namespace my\name; // 参考 "定义命名空间" 小节

class MyClass {}

function myfunction() {}

const MYCONST = 1;

$a = new MyClass;

$c = new \my\name\MyClass; // 参考 "全局空间" 小节

$a = strlen(‘hi‘); // 参考 "使用命名空间:后备全局函数/常量" 小节

$d = namespace\MYCONST; // 参考 "namespace操作符和__NAMESPACE__常量” 小节

$d = __NAMESPACE__ . ‘\MYCONST‘;

echo constant($d); // 参考 "命名空间和动态语言特征" 小节

?>

*namespace关键字和__NAMESPACE__常量

<?php

namespace MyProject;

echo ‘"‘, __NAMESPACE__, ‘"‘; // 输出 "MyProject"

?>

*全局空间

如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,

与 PHP 引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是

全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。

<?php

namespace A\B\C;

/* 这个函数是 A\B\C\fopen */

function fopen() {

/* ... */

$f = \fopen(...); // 调用全局的fopen函数

return $f;

}

?>

九 超全局变量

$GLOBALS

$_SERVER

$_GET

$_POST

$_FILES

$_COOKIE

$_SESSION

$_REQUEST

$_ENV

十 垃圾回收机制

* 引用计数器,每个php变量都保存在一个叫“zval”的变量容器中,除了包含变量的类型和值,

还包括两个字节的额外信息,第一个是“is_ref”是一个bool 值 用来标识是否属于引用集合

第二个额外的字节是refcount 用于统计引用次数

<?php

$a = "new string";

xdebug_debug_zval(‘a‘);

?>

结果:a: (refcount=1, is_ref=0)=‘new string‘

* 如果一个引用计数增加 它将继续呗使用,如果引用计数减少到0,所在变量容器将呗清零(free)

时间: 2024-12-08 22:22:23

php 语言总结的相关文章

使用R语言计算均值,方差等

R语言对于数值计算很方便,最近用到了计算方差,标准差的功能,特记录. 数据准备 height <- c(6.00, 5.92, 5.58, 5.92) 1 计算均值 mean(height) [1] 5.855 2 计算中位数 median(height) [1] 5.92 3 计算标准差 sd(height) [1] 0.1871719 4 计算方差 var(height) [1] 0.03503333 5 计算两个变量之间的相关系数 cor(height,log(height)) [1] 0

GCC在C语言中内嵌汇编 asm __volatile__ 【转】

转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作. 1.简单的内嵌汇编 例: __asm__ __volatile__("hlt"); "__asm__"表示后面的

C语言轻松高效学习方法之:多种方法实现

多种方法实现同一个功能,可以调动你学的所有知识去做,有助于你学的融会贯通. 下面举例来看: 实现功能:求一个整数的位数: 实现语言:C语言: 开发环境:Visual Studio 2017 如:3215是4位数 实现原理: 3215/10 = 321 ----1位数 321/10 = 32 ----又是1位数 32/10 = 3 ----又是1位数 3/10 = 0 ----又是1位数 共4位数,且终止计算条件是/10结果为0的时候: 根据这个原理,先写一个最笨的原始方法: 效果: 这种实现方案

轻松学习C语言编程的秘诀:总结+灵感

目前在准备一套C语言的学习教程,所以我这里就以C语言编程的学习来讲.注意,讲的是"轻松学习",那种不注重方法,拼命玩命的方式也有其效果,但不是我提倡的.我讲究的是在方式方法对头.适合你.减轻你学习负担和心里压力的前提下,才适当的抓紧时间. 因此,探索一种很好的学习方法就是我所研究的主要内容. 众所周知,学习C语言并非易事,要学好它更是难上加难.这和你期末考试背会几个题目的答案考上满分没多大关系,也就是说你考试满分也说明不了你学好.学精通了C语言.那么怎么才算学精通C语言?闭着眼睛对自己

详解go语言的array和slice 【二】

上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲解到创建新的slice时使用第三个索引来限制slice的容量,在操作新slice时,如果新slice的容量大于长度时,添加新元素依然后使源的相应元素改变.这一篇里我会讲解到如何避免这些问题,以及迭代.和做为方法参数方面的知识点. slice的长度和容量设置为同一个值 如果在创建新的slice时我们把

自动生成小学四则运算题目(C语言)

这个简易四则运算是我在百度上找的博主叫53余雅诗的一篇c语言代码,网址为http://www.cnblogs.com/ys1101/p/4368103.html,功能是可以选择加减乘除进行简易的四则运算,判断对错.我在VS2017上编译没有bug,因为功能只有整数运算,所以我在此基础上加了真分数的四则运算以及统计得分等,最后成功运行程序.我把我的源代码放在github上,地址为https://github.com/xiaofancheng/helloworld.

PAT 1009 说反话 C语言

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格. 输出格式:每个测试用例的输出占一行,输出倒序后的句子. 输入样例: Hello World Here I Come 输出样例: Come I Here World Hello 1 #include<stdio.h> 2 #

PAT 1006 换个格式输出 C语言

让我们用字母B来表示"百".字母S表示"十",用"12...n"来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为它有2个"百".3个"十".以及个位的4. 输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000). 输出格式:每个测试用例的输出占一行,用规定的格式输出n. 输入样例1: 234 输出样例1: BBSSS1

Go语言 IDE之Gogland配置使用

Gogland 是 JetBrains 公司推出的 Go 语言集成开发环境.Gogland 同样基于 IntelliJ 平台开发,支持 JetBrains 的插件体系.目前正式版尚未发布.官方:https://www.jetbrains.com/go/.关于使用,即将开始咯! 一.安装Golang 1) 首先到https://golang.org/dl/选择适合你系统的安装包,(墙内:http://golangtc.com/download). 2)下载完成安装到指定目录即可.我这里是(D:\G

R语言快速上手入门

R语言快速上手入门 课程学习网址:http://www.xuetuwuyou.com/course/196 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本教程深入浅出地讲解如何使用R语言玩转数据.课程中涵盖R语言编程的方方面面,内容涉及R对象的类型.R的记号体系和环境系统.自定义函数.if else语句.for循环.S3类R的包系统以及调试工具等.本课程还通过示例演示如何进行向量化编程,从而对代码进行提速并尽可能地发挥R的潜能.本课程适合立志成为数据科学家的