目录:
PHP 变量
变量以 $ 符号开始,后面跟着变量的名称。
变量名是区分大小写的($y 和 $Y 是两个不同的变量)。
PHP 和 python 一样是一门弱类型语言,不用声明类型。PHP 会根据变量的值,自动把变量转换为正确的数据类型。
- local:局部作用域,一般在函数内部定义。
- global:全局作用域,在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字。(PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。)
- static:静态变量,和 C 语言相同。
- parameter:参数是通过调用代码将值传递给函数的局部变量。
小例子:
<!--/**-->
<!-- * Created by PhpStorm.-->
<!-- * User: andy.wwh-->
<!-- * Date: 2016/7/27-->
<!-- * Time: 17:34-->
<!-- */-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello world</title>
</head>
<body>
<?php
echo "hello 886\n";
$x = 10;
$y = 20;
echo $x+$y;
echo "<br>";
function Hello() {
global $x, $y;
static $z = 100;
$z += 1;
echo $x, $y, $z;
//echo $GLOBALS['y'] = $GLOBALS['x'];
}
echo "<br>";
echo Hello();
echo "<br>";
echo Hello();
?>
</body>
</html>
print 和 echo
在 PHP 中有两个基本的输出方式: echo 和 print。
echo 和 print 区别:
- echo - 可以输出一个或多个字符串
- print - 只允许输出一个字符串,返回值总为 1
PHP 数据类型
String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值)。
小例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello world</title>
</head>
<body>
<?php
//字符串
$x = "hello world";
//整型
$y = 10;
$y = 0x10;
$y = 010;
//布尔
$z = true;
//数组
$cars = array("one", "two", "three");
var_dump($cars);
echo "<br>";
//对象
class Foo{
var $bar;
/**
* Foo constructor.
* @param $bar
*/
public function __construct($bar)
{
$this->bar = $bar;
}
/**
* @param mixed $bar
*/
public function setBar($bar)
{
$this->bar = $bar;
}
/**
* @return mixed
*/
public function getBar()
{
return $this->bar;
}
}
$foo = new Foo("hello world");
echo $foo->getBar();
echo "<br>";
//NULL
$x = null;
$x = 100;
?>
</body>
</html>
PHP 常量
设置常量,使用 define() 函数,函数语法如下:
bool define ( string $name , mixed $value, [ bool $case_insensitive = false ] )
- name:必选参数,常量名称,即标志符。
- value:必选参数,常量的值。
- case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的。
常量在定义后,默认是全局变量,可以在整个运行的脚本的任何地方使用。
define($bar, 1000, true);
PHP 字符串变量
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello world</title>
</head>
<body>
<?php
$txt = "hello world";
echo $txt;
echo "<br>";
//测试长度
echo strlen($txt);
echo "<br>";
$txt2 = "!!!";
// . 连接字符串
echo $txt . " " . $txt2;
echo "<br>";
//strpos 查找字符串位置
echo strpos($txt, "world");
echo "<br>";
?>
</body>
</html>
PHP 运算符
算数运算符
PHP7+ 版本新增整除运算符 intdiv()
赋值运算符
递增、递减
比较运算符
逻辑运算符
数组运算符
三元运算符
(expr1) ? (expr2) : (expr3)
if…else、switch
和 C 语言的用法相同,但 switch 不仅可用于 整数,其它类型也可以。
switch 工作原理:首先对一个简单的表达式 n(通常是变量)进行一次计算。将表达式的值与结构中每个 case 的值进行比较。如果存在匹配,则执行与 case 关联的代码。
PHP 数组
在 PHP 中创建数组
array();
在 PHP 中,有三种类型的数组:
- 数值数组 - 带有数字 ID 键的数组
- 关联数组 - 带有指定的键的数组,每个键关联一个值
- 多维数组 - 包含一个或多个数组的数组
<?php
//数值数组
$cars = array("奥迪", "奔驰");
echo $cars[0] . "<br>";
echo $cars[1] . "<br>";
echo "length:" . count($cars) . "<br>";
//遍历数值数组
for ($i = 0; $i < count($cars); ++$i) {
echo $cars[$i] . "<br>";
}
//关联数组
$age = array("X" => 18, "Y" => 20, "Z" => 100);
echo "A:" . $age[X] . "<br>";
//遍历关联数组
foreach ($age as $v=>$value) {
echo $v . ":" . $value . " ";
}
//多维数组
$arr = array(
array(1, 2, 3),
array(4, 5, 6),
array(7, 8, 9)
);
print_r($arr);
?>
PHP 数组排序
排序函数:
- sort() - 对数组进行升序排列
- rsort() - 对数组进行降序排列
- asort() - 根据关联数组的值,对数组进行升序排列
- ksort() - 根据关联数组的键,对数组进行升序排列
- arsort() - 根据关联数组的值,对数组进行降序排列
- krsort() - 根据关联数组的键,对数组进行降序排列
<?php
//数组排序
$car = array("A", "C", "B");
sort($car);
for ($i = 0; $i < count($car); ++$i) {
echo $car[$i] . " ";
}
rsort($car);
for ($i = 0; $i < count($car); ++$i) {
echo $car[$i] . " ";
}
//关联数组排序
$age = array("A"=>18, "C"=>22, "B"=>10);
asort($age);
//rsort($age);
//arsort($age);
//krsort($age);
foreach ($age as $k => $value) {
echo $k . ":" . $value . " ";
}
?>
超级全局变量:
PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
$_SERVER 是一个包含了诸如头信息 (header)、路径 (path)、以及脚本位置 (script locations) 等等信息的数组。这个数组中的项目由 Web 服务器创建。
PHP $_REQUEST 用于收集HTML表单提交的数据。
<html>
<body>
//点击提交按钮时表单数据会提交到 action 指定的脚本中
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
//也可以通过 REQUEST 来获取
<?php
$name = $_REQUEST['fname'];
echo $name;
?>
</body>
</html>
PHP $_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:”method=”post”。
PHP
PHP 循环
在 PHP 中,提供了下列循环语句:
- while - 只要指定的条件成立,则循环执行代码块
- do…while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环
- for - 循环执行代码块指定的次数
- foreach - 根据数组中每个元素来循环代码块
foreach 循环用于遍历数组。
foreach (
arrayas value)
{
要执行代码;
}
PHP 函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello world</title>
</head>
<body>
<?php
function hello() {
echo "hello world ";
}
function hi($name) {
echo "name:" . $name . " say Hi";
}
function goodBye($name) {
echo "name:" . $name . " say goodBye";
return $name;
}
hello();
hi('jake');
goodBye('jake');
?>
</body>
</html>
PHP 魔术变量
- LINE
- FILE
- DIR
- FUNCTION
- CLASS
- TRAIT
- METHOD
- NAMESPACE
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello world</title>
</head>
<body>
<?php
//namespace co;
echo "__line__:" . __LINE__ . "<br>";
echo "__FILE__:" . __FILE__ . "<br>";
echo "__DIR__:" . __DIR__ . "<br>";
function hello() {
echo "__FUNCTION__:" . __FUNCTION__ . "<br>";
}
class bar {
public function sayHello() {
echo "__CLASS__:" . __CLASS__ . "<br>";
}
}
trait trait_one {
public function one() {
echo "one" . "<br>";
}
}
trait trait_two {
public function two() {
echo "two" . "<br>";
}
}
class foo {
use trait_one, trait_two;
public function three() {
echo "__METHOD__:" . __METHOD__ . "<br>";
$this->one();
$this->two();
}
}
hello();
$b = new bar();
$b->sayHello();
$f = new foo();
$f->three();
//echo "__namespace__" . __NAMESPACE__ . "<br>";
?>
</body>
</html>
关于 trait 参考 Traits vs. Interfaces
命名空间
PHP 命名空间可以解决以下两类问题:
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
PHP 命名空间中的类名可以通过三种方式引用:
- 非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。
- 限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。
- 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。
<?php
/**
* Created by PhpStorm.
* User: andy.wwh
* Date: 2016/7/28
* Time: 10:55
*/
//在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
declare(encoding='utf-8');
//namespace MyNameSpace;
namespace MyNameSpace {
function bar() {
echo __NAMESPACE__ . " hello world" . "<br>";
}
}
//全局代码
namespace {
function bar() {
echo __NAMESPACE__ . " hello world" . "<br>";
}
}
//子命名空间,命名空间可以分层
namespace MyNameSpace\Sub {
function bar() {
echo __NAMESPACE__ . " hello world" . "<br>";
}
}
namespace {
bar();
MyNameSpace\bar();
MyNameSpace\Sub\bar();
}
//别名和导入
//use MyNameSpace\Sub;
//use MyNameSpace\Sub as One;
?>
更具体可参考 PHP 命名空间
PHP 面向对象
和 Java 很类似,封装、继承、多态。
extends 实现单继承,implements 可以实现多个接口。
<?php
/**
* Created by PhpStorm.
* User: andy.wwh
* Date: 2016/7/28
* Time: 11:15
*/
interface Character {
public function brake();
}
//PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
class Car {
//定义常量不用加 $
const contact = "常量";
//如果用 var 定义,则被视为公有。
var $color;
private $size;
private $name;
/**
* Car constructor.
* @param $color
* @param $size
*/
public function __construct($color, $size)
{
$this->color = $color;
$this->size = $size;
$this->name = "car";
}
public function run() {
echo "run..." . $this->name;
}
/**
* @param string $name
*/
public function setName(string $name)
{
$this->name = $name;
}
/**
* @return string
*/
public function getName()
{
return $this->name;
}
public function toString() {
echo "color:" . $this->color . "<br>";
echo "size:" . $this->size . "<br>";
echo "name:" . $this->name . "<br>";
}
}
class Audi extends Car implements Character{
/**
* Audi constructor.
* PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,
* 需要在子类的构造方法中调用 parent::__construct() 。
*/
public function __construct($color, $size)
{
parent::__construct($color, $size);
parent::setName("audi");
}
public static function hello() {
echo "hello world" . "<br>";
}
//如果 run 方法声明为 final 则不能被覆盖
public function run()
{
parent::run(); // TODO: Change the autogenerated stub
}
public function brake()
{
// TODO: Implement brake() method.
echo $this->getName() . "...brake" . "<br>";
}
}
$car = new Car("red", 100);
$audi = new Audi("black", 1000);
echo $car->toString();
echo "<br>";
echo $audi->toString();
//常量可以不创建对象使用
//由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
//静态属性不可以由对象通过 -> 操作符来访问。
echo Audi::contact . "<br>";
echo Audi::hello() . "<br>";
?>