- PHP代码可以放进HTML中,如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php learning</title>
</head>
<body>
<h1>My first php page</h1>
<?php
echo "hello world";
echo "<br>"
?>
</body>
</html>
2.单行注释:同按Ctrl和/
多行注释:同按Ctrl和Shift和/
效果如下:
//这是单行注释
/* 这是多行注释 */
3.函数内访问全局变量;
(函数内变量不可被外部访问)
<?php
$x=5;
function myTest()
{
global $x;//关键字,函数内访问全局变量
$y=7;
echo "<p>测试函数内部变量<p>";
echo "<br>";
echo "变量x为: $x";//报错,$x前加global就不报错了,$x是函数外部变量
echo "<br>";
echo "变量y为: ".$y;//用点号连接,$y是函数内部变量
}
myTest();//函数调用
echo "<p>测试函数外部变量<p>";
echo "变量x为: $x";//也可以写成 echo"变量x为: ".$x;
echo "<br>";
//echo"变量y为: $y";//会报错,在函数外部不能访问专属函数内的变量
?>
4.函数内部利用全局变量进行运算;global
phpinfo(); 会显示PHP版本等信息
<?php
$x=4;
$y=9;
function mytest()
{
global $x,$y;
$y+=$x;
}
mytest();
echo $y;
phpinfo();
?>
又或者:
<?php
$x=5;
$y=10;
function mytest()
{
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
//echo $GLOBALS['y'];
}
mytest();
echo $y;//15
?>
5.函数中令局部变量始终保存供每次调用; static
<?php
function sta(){
static $num=0;
echo $num."<br>";
$num++;
}
sta();//0
sta();//1
sta();//2
sta();//3
?>
6.形参,实参
<?php
function test($x){//形参
echo $x;
}
test(5);//实参。传值给形参
?>
7.数组
<?php
$abc=array("apple","banana","camel");
echo "I love ".$abc[0]." "."I hate ".$abc[1]."<br>";
print "I love ".$abc[0]." "."I hate ".$abc[1]."<br>";
?>
8.var_dump();查看数据类型
数据类型 :string int float boolean array object Null
<?php
$abc=array("apple","banana","camel");
echo "<pre>";
var_dump($abc);
echo "</pre>";//预先定义json格式
?>
9.if else语句
<?php
$a=3;
if($a>1){
echo "yes";
}else{
echo "no";
}//yes
?>
10.while
<?php
$a=3;
while($a>0){
echo $a;
$a--;
}//321
?>
11.switch
<?php
$col="red";
switch ($col){
case "red":
echo "红色";
break;
case "yellow":
echo "黄色";
break;
case "blue":
echo "蓝色";
break;
default:
echo "五光十色";
}//红色
?>
12.do{}while
<?php
$a=3;
do{
echo $a;
$a--;
}while($a>0);
?>//321
13.for
<?php
for($a=3;$a>0;$a--){
echo $a;
}//321
?>
14.foreach循环遍历数组
<?php
$x=array("apple","banana","orange");
foreach ($x as $value){
echo $value."<br>";//或者echo "$value<br>";
}
?>
15.类,对象,setName(),getName()
类中有属性和方法,好比水果类,具体的水果对象就是橘子,香蕉等,他们的名称,颜色,口味等都是水果类的属性,不同的对象对应不同的属性值;方法即函数,就是为了执行某一任务,通过被调用而完成某项功能;
setName()和getName()如何生成:在PhpStorm中鼠标右键,点击Generate->Setters and Getters->For all methods->OK
<?php
class Fruit{
public $name;//属性
public $color;//属性
/**
* @return mixed
*/
public function getName()//方法
{
return $this->name;//$this引用当前对象,仅用于函数内
}
/**
* @param mixed $name
*/
public function setName($name)//方法 形参
{
$this->name = $name;//形参需要接收传来的实参,并将其赋值给当前对象的name属性
}
}
$pear=new Fruit();//用类创建对象
$pear->setName("梨子");//传实参,此时$pear这个对象的属性name就是“梨子”
echo $pear->name;//梨子
echo $pear->getName();//梨子
?>
16.手动创建set方法:set_name是自己取的方法名
<?php
class Fruit{
public $name;
public $color;
function set_name($name){
$this->name=$name;
}
}
$pear=new Fruit();
$pear->set_name("梨子");
echo $pear->name;//梨子
?>
其实,不用set_name或setName方法,也可以直接给公共属性赋值
<?php
class Fruit{
public $name;
public $color;
/*function set_name($name){
$this->name=$name;
}*/
}
$pear=new Fruit();
//$pear->set_name("梨子");
$pear->name="脆梨";
echo $pear->name;//脆梨
?>
17.检查对象是否属于某类
<?php
class A{
public $name;
}
$a=new A();
var_dump($a instanceof A);//bool(true)
?>
18.魔术方法添加:在PhpStorm中鼠标右键->Generate->Implement methods…
PHP中把以两个下划线_ _开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。
19.魔术方法: _ _construct() , _ _destruct()
<?php
class Stu{
public $name;
public $age;
public function sayHello(){
echo "我叫".$this->name." 我今年".$this->age."岁啦!"."<br>";
}
public function __construct($name="小李子",$age=17)//构造函数,默认为空,对象第一个调用
{
//默认为空
$this->name=$name;
$this->age=$age;
}
public function __destruct()//销毁析构方法 用完对象后自动调用(销毁对象前的清理)
{
// 默认为空
echo "对象销毁前的清理ing~<br>";
}
}
$stu1=new Stu();//创建对象
$stu1->sayHello();//我叫小李子 我今年17岁啦!
unset($stu1);//销毁对象,自动调用__destruct() 输出:对象销毁前的清理ing~
$stu2=new Stu("杰克",22);//创建对象时,想要给对象的属性赋值或者更改属性值,前提是构造函数__construct()得非空
$stu2->sayHello();//我叫杰克 我今年22岁啦!
$stu3=new Stu("奥瑞克");//同理,前提是构造函数__construct()得非空,name由“小李子”改成“奥瑞克”,age默认是__construct中的17
$stu3->sayHello();//我叫奥瑞克 我今年17岁啦!
//现在如果运行在浏览器中,表明对象stu2和stu3停止使用了,会自动调用__destruct(),输出两遍:对象销毁前的清理ing~
?>
20.魔术方法:_ _call() , _ _callStatic()
<?php
class Stu{
public $name;
public $age;
public function __call($name, $arguments)//默认
{
// 默认为空
echo "您所调用的函数名为: ".$name."(参数: "; //输出调用的不存在的方法名
print_r($arguments); //输出被调用的不存在的方法时的参数列表
echo "不存在)<br>";
}
public static function __callStatic($name, $arguments)//默认
{
//默认为空
echo "您所调用的函数名为: ".$name."(参数: ";
print_r($arguments);
echo "不存在)<br>";
}
}
$stu1=new Stu();
$stu1->sayno();//调用的__call;您所调用的函数名为: sayno(参数: Array ( ) 不存在)
$stu1->saybye("bye");//调用的__call;您所调用的函数名为: saybye(参数: Array ( [0] => bye ) 不存在)
$stu1::sayno("no");//调用的__callStatic;您所调用的函数名为: sayno(参数: Array ( [0] => no ) 不存在)
//__call 与__callStatic 都是在调用不可访问的函数时被自动调用,只是调用时格式的差别
?>
21.魔术方法:_ _set(), _ _get()
<?php
class A{
private $name;//私有变量
private $age;//私有变量
public function hello(){
echo "我是".$this->name."今年".$this->age."岁了"."<br>";
}
public function __set($name, $value)//默认
{//默认为空
$this->$name=$value;//这里的$name储存的是访问的私有变量的名称(这里$name=“name”),$value中储存的是手动传入的私有变量的值(这里$value="玲珑")
}
public function __get($name)//默认
{//这里的$name用于存储想要获知的私有变量属性值的名称
// 默认为空
if($name=="name"){
return $this->name;}
else{
return $this->age;}
}
}
$a=new A();
$a->name="玲珑";//设置私有属性手动赋值时,会调用__set方法
$a->age="24";//设置私有属性手动赋值时,会调用__set方法
$a->hello();//我是玲珑今年24岁了
echo $a->name;//玲珑 想要获取name私有属性值,自动调用__get方法
echo $a->age;//24 想要获取age私有属性值,直接调用__get方法
?>
22.魔术方法:_ _isset(), _ _unset()
如果一个对象成员属性是公共的,就能用unset()删除对象的公有属性,但如果成员属性是私有的,照常来说是没有权限的,若将__unset()自定义的加在对象中(类中加入此方法),就可以在对象的外部去删除私有成员属性;isset()和__isset()也同理。
isset():测定某变量/成员属性是否存在,仅限公有变量/成员属性
unset():删除某变量/成员属性,仅限公有变量/成员属性
<?php
class Stu{
private $name;
private $age;
private $sex;
public function __construct($name="",$age=25,$sex="男")
{
$this->name=$name;
$this->age=$age;
$this->sex=$sex;
}
public function sayHello(){
echo "姓名:".$this->name." 年龄:".$this->age." 性别:".$this->sex."<br>";
}
public function __isset($name)//默认
{
// 默认为空
if($name=="name")
return false;//如果是name这个私有属性,则不能用isset()测试其是否存在,返回false
return isset($this->$name);//其余的属性可随意指定测试
}
public function __unset($name)//默认
{
// 默认为空
if($name=="name")
return;//退出方法,如果是name这个私有属性,则不能用unset()删除
unset($this->$name);//其余的属性可随意指定删除
}
}//公有属性肯定能被测定是否存在和删除,私有属性就不一定了,还得看自定义的__isset()和__unset()有没有“保护”某个私有属性
$stu1=new Stu("小荷",17,"女");
$stu1->sayHello();//姓名:小荷 年龄:17 性别:女
var_dump(isset($stu1->name));//bool(false) 无权测定name属性,因为被类中的__isset()“保护”起来了
var_dump(isset($stu1->age));//bool(true) 测定age属性存在
var_dump(isset($stu1->sex));//bool(true) 测定sex属性存在
unset($stu1->name);//无权删除该私有属性,,因为被类中的__unset()“保护”起来了
unset($stu1->age);//删除age属性成功
unset($stu1->sex);//删除sex属性成功
$stu1->sayHello();//姓名:小荷 年龄: 性别:
var_dump(isset($stu1->age));//bool(false) 测定age属性不存在
var_dump(isset($stu1->sex));//bool(false) 测定sex属性不存在
?>
23.魔术方法:_ _sleep(), _ _wakeup()
serialize()会自动调用自定义的__sleep(),serialize() 序列化,会将一个对象转换成一个字符串
unserialize()会自动调用自定义的__wakeup(),unserialize() 反序列化,会将字符串还原成一个对象
<?php
class Stu{
public $sex;
private $name;
protected $age;
public function __construct($name="",$age=25,$sex="男")
{
$this->name=$name;
$this->age=$age;
$this->sex=$sex;
}
public function __sleep()
{
echo "在类的外部使用serialize()会调用这里的__sleep()方法";
echo"<br>";
$this->age=17;
return array("name","age");
}
public function __wakeup()
{
echo "在类的外部使用unserialize()会调用这里的__wakeup()方法";
$this->name="小荷";
$this->sex="女";
}
}
$p=new Stu("萧霖");
echo serialize($p);//首先会调用__sleep(),之后(根据__sleep()中的return)再序列化,若没有__sleep()或没有return什么属性,则所有参数(name age sex)序列化,unserialize也同理
//输出:在类的外部使用serialize()会调用这里的__sleep()方法
//输出:O:3:"Stu":2:{s:9:"Stuname";s:6:"萧霖";s:6:"*age";i:17;}
echo "<br>";
$a=var_dump(serialize($p));//输出:在类的外部使用serialize()会调用这里的__sleep()方法
// 输出:string(61) "O:3:"Stu":2:{s:9:"Stuname";s:6:"萧霖";s:6:"*age";i:17;}"
echo "<br>";
var_dump(unserialize(serialize($p)));//输出:在类的外部使用serialize()会调用这里的__sleep()方法
//输出:在类的外部使用unserialize()会调用这里的__wakeup()方法
//输出:object(Stu)#2 (3) { ["sex"]=> string(3) "女" ["name":"Stu":private]=> string(6) "小荷" ["age":protected]=> int(17) }
?>
- public的属性序列化,其属性名仍是本来的属性名
- private的属性序列化,其属性名显示为 %00类名%00属性名
- protected的属性序列化,其属性名显示为 %00*%00属性名
以序列化输出的O:3:“Stu”:2:{s:9:“Stuname”;s:6:“萧霖”;s:6: “*age”;i:17;}为例来理解各自含义
O:object
3:类名长度
“Stu”:类名
2:显示的属性的个数
s:属性名类型string
9:属性名长度或随属性名更改后的长度
“Stuname”:属性名或自动改动后的属性名
s:属性值类型string
6:属性值长度
“萧霖”:属性值
s:属性名类型string
6:属性名长度: 1(1个 *)+2(2个%00空字符)+3(age)=6
“*age”:属性名或自动更改的属性名
i:属性值类型int
17:属性值
24.魔术方法:_ _toString()
类对象想要转化成字符串被echo出,得用__toString()
<?php
class Person
{
public $sex;
public $name;
public $age;
public function __construct($name = "", $age = 25, $sex = "男")
{
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
public function __toString()
{
return $this->name;
//return "你好";
}
}
$p=new Person("小米",24,"女");
print_r($p);//输出:Person Object ( [sex] => 女 [name] => 小米 [age] => 24)
echo $p;//小米 类对象想要转化成字符串被echo出,得用__toString()
?>
25.魔术方法:_ _invoke(), _ _clone()
__invoke(): 把对象当成函数去调用 会触发__invoke()方法
__clone(): 用来克隆对象
<?php
class Person
{
public $sex;
public $name;
public $age;
public function __construct($name = "", $age = 25, $sex = "男")
{
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
public function __invoke()
{//默认为空,自定义
echo "这可是一个对象哦<br>";
}
public function __clone()
{//默认为空,自定义
echo "你正在克隆对象<br>";
}
}
$p=new Person("小米");
$p();//输出:这可是一个对象哦 把对象当成函数去调用 会触发__invoke()方法
$q=clone $p;//输出:你正在克隆对象
var_dump($p);//输出:object(Person)#1 (3) { ["sex"]=> string(3) "男" ["name"]=> string(6) "小米" ["age"]=> int(25) }
echo "<br>";//换行
var_dump($q);//输出:object(Person)#2 (3) { ["sex"]=> string(3) "男" ["name"]=> string(6) "小米" ["age"]=> int(25) }
?>