PHP学习笔记
定义变量
变量定义时使用单双引号区别
$aa = "2333"
$msg = "一段没啥用的无意义文字,$aa"
//上面会将2333也输出出来
$msg = '一段没啥用的无意义文字,$aa'
//单引号不会输出2333而是作为单独的"$aa"输出哦
php对大小写敏感
定义多进制变量
$a =123;//十进制
$b = 0b101;//二进制
$c = 0564;//八进制
$d = 0x12f;//十六进制
输出时网页默认按照10进制输出,
手动转换进制:base_convert(变量名, 变量进制, 要转换成的进制)
数据类型转换与判断
以字母开头的变量转换为数值永远为0
以数字开头的变量截至到第一个字符或第二个小数点前
可以通过(类型)变量名
的方法强制转换
强制转换后的变量不对变量本身进行修改,只读取数据转换输出
settype(变量名,'类型')
会彻底改变变量类型
var_dump(is_类型(变量名))
可以输出数据类型和数值
gettype(变量名)
可以输出数据类型
Empty()
判断变量值是否像空字符串之类的为空,空则true
Isset()
判断变量是否存在,存在则true
长文本变量
$string1 = <<<PIG
111
222
333
444
PIG;
//此处PIG可自定义名字,但是在起始行和结尾行必须是这个格式才行,输出时也是按照这个格式输出的
常量
define("aa",123,false);
define($bb,123,true);
const aa = 123;
第一个参数是必选参数常量名称
第二个参数是必选参数常量值
第三个参数是可选参数,是否大小写敏感,设定为true表示不敏感,默认为false
可以用constant($name)
的方法取值
使用defined($name)
的方法会返回常量是否被定义
系统常量
__FILE__
:php程序文件名。获取当前文件在服务器的物理位置。
__LINE__
:PHP程序文件行数,获取当前代码在第几行。
PHP_VERSION
:当前解析器的版本号。
PHP_OS
:执行当前PHP版本的操作系统名称。
echo __FILE__;
//调用
定义数组
$name= array("111","222","333");
$name= array('3'=>'444');
//此处会重置数组并赋值第四个位置
print_r($name);
//输出数组
$name0 = $name[0]
//获取数组特定位置数值
自定义键值
$name = array(
'key1'=>"msg1",
'key2'=>"msg2",
'key3'=>"msg3"
);
遍历元素
foreach (数组 as 下标 => 值){
//任务
}
类与对象
定义类
class name {
function getName() {
return $this->name;
}
//定义普通方法
public static function getName2() {
return $this->name;
}
//定义静态方法
}
静态属性(static
)与方法可以在不实例化类的情况下调用
直接使用类名::方法名
即可调用,此处可以用变量名代替类名和方法名动态调用
静态属性不能用->
调用
静态方法中$this
不可用,但是可以用self
,parent
和static
在内部调用静态方法与属性,如
self::$name; parent::name();
继承类
class new extends name {
public function xxx(){
$this->属性名=parent::方法名();
}
}
//定义继承类
访问控制
protected $proname = 'proname1';
//定义受保护的属性,外部不可调用
private $priname = 'priname1';
//定义私有属性,外部不可调用
public $pubname = 'pubclass1';
//定义公有属性,外部可调用
在方法或属性定义时会固定有访问控制
方法默认为公有,属性必须自定
如果用var方法定义属性则为公有
构造函数
function __construct() {
print "构造函数被调用\n";
}
//定义构造函数,对象创建时调用该函数,子类定义构造函数就不会调用父类的这个函数了
//要在子类里用这行代码
parent::__construct();
//调用父类构造函数
function __destruct() {
print "析构函数被调用 \n";
}
//定义析构函数,对象被销毁时执行
如果将构造函数定义成了私有的方法就无法直接实例化对象了,但静态方法依然可以实例化该函数
clone与序列化
public function __clone() {
$obj = new functionName();
$obj->name = $this->name;
}
//复制对象触发clone方法
$a = new functionName();
$b = clone $a;
$b= serialize($a);
//对象序列化成字符串
$a = unserialize($b);
//反序列化为对象
//不知道有啥用
执行serialize()
时,会先调用__sleep()
函数
执行unserialize()
时,会先调用__wakeup()
函数
实例化与设置 输出
$name = new name ();
echo $name ->getName();
//实例化对象并输出name为默认pubclass1
$name->name = 'class2';
//设置对象的属性值
echo $name->getName();
//调用对象的方法输出名字为class2
echo name::getName2();
调用静态方法
重载/魔术方法
以两个下划线__
开头的方法称为魔术方法(Magic methods)
对不存在属性的操作
public function __set($key, $val) {
$this->ary[$key] = $val;
}
//赋值
public function __get($key) {
if (isset($this->ary[$key])) {
return $this->ary[$key];
}
return null;
}
//获取
public function __isset($key) {
if (isset($this->ary[$key])) {
return true;
}
return false;
}
//判断是否设置
public function __unset($key) {
unset($this->ary[$key]);
}
//销毁
使用不存在的方法
public function __call($a, $b) {
//功能
}
public function __callStatic($a, $b) {
//功能
}
对不存在的方法使用时会触发__call
不存在的静态方法会使用__callStatic
其他的好用东西
当类被当成字符串直接echo $name
时触发__toString()
,方法中必须return
当类被当成函数时直接$name()
时触发__invoke()
自动加载,当代码执行创建实例时如果没有找到对应的类时会调用__autoload()
将类名传入自动寻找并导入相同名字的php文件
function __autoload($className) {
$filePath =“路径/{$className}.php";
if (is_ readable($filePath)) {
require($filePath);
}
}
if else不好用? 三元运算符了解一下 判断式 ? "true" : "flase";
文件加载
在<?php ?>
语句内可以使用incloud()
或require()
的方法填入地址引入文件内容,引入的文件内容会完整的替换掉使用方法的字段,比如在1.php中有如下代码
<?php for ($i = 1; $i <= 9; $i++) : ?>
<tr>
<?php for ($a = 1; $a <= $i; $a++) : ?>
<td>
<?php echo $a . "*" . $i . "=" . $i * $a; ?>
</td>
<?php endfor; ?>
</tr>
<?php endfor; ?>
在index.php中进行调用
<table border="0" cellspacing="0" cellpadding="3">
<caption>九九乘法表</caption>
<?php
require("./php/1.php")
?>
</table>
最终输出的结果是
但是在调用的过程中有一些细节问题,譬如在中间再引入一个1.php调用2.php,在index中调用1.php
//2.php
<?php for ($i = 1; $i <= 9; $i++) : ?>
<tr>
<?php for ($a = 1; $a <= $i; $a++) : ?>
<td>
<?php echo $a . "*" . $i . "=" . $i * $a; ?>
</td>
<?php endfor; ?>
</tr>
<?php endfor; ?>
//1.php
<?php
include("./php/phphp/2.php");
?>
//index.php
<table border="0" cellspacing="0" cellpadding="3">
<caption>九九乘法表</caption>
<?php
require("./php/1.php")
?>
</table>
在这之中,作为中转调用的1.php调用时获取的地址是要以index.php作为根路径相对的2.php
在多层文件嵌套中,使用的相对定位要以所有文件最终被调用到的主文件作为根路径
(其实一层套一层的话在最后一层调用第一层就能打开无限循环的大门了 )