重新学一遍基础的,以下是学习时的一些个人向笔记,并没有面面俱到
//
单行注释,C++风格#
单行注释,shell风格/**/
多行注释,C语言风格多行注释中不能嵌套使用多行注释
可变变量通常会用到数组中,如果你写下这样的变量:$$a[1]
,会造成模棱两可的问题
如果想表示:$$a + [1],应该表示为:${$a}[1]
如果想表示:$ + $a[1],应该表示为:${$a[1]}
bool define ( string name, mixed value [, bool case_insensitive] ) ;
name:名称
value:值
case_insensitive:是否大小写敏感,不敏感则TRUE
define("GREETING","Hello world!");
__LINE__
显示当前代码在多少行
__FILE__
获取当前文件绝对路径
__DIR__
获取当前文件所在的目录
__FUNCTION__
获取当前方法的名称
__CLASS__
获取当前类的名称
__NAMESPACE__
取当前命名空间的名称,也就是namespace的名称
namespace xxxx\index;
class DMIND{
function show()
{
echo "__CLASS__:".__CLASS__."\n";
echo "__FUNCTION__:".__FUNCTION__."\n";
}
}
$a=new D();
$a->show();
echo"__NAMESPACE__".__NAMESPACE__;
?>
注意=
(赋值运算符)优先级高于and、or…(逻辑运算符)
http://c.biancheng.net/view/7272.html
break 语句是一种常见的跳转语句,用来结束当前的for、foreach、while、do-while、switch等结构的执行。
continue 只是退出本次循环,并不是终止整个程序的运行。而 break 语句则是结束整个循环语句的运行
return() 是语言结构而不是函数,仅在参数包含表达式时才需要用括号将其括起来,当返回一个变量时通常不用括号
/*一定要小心变量作用域*/
function insert_dynamic()
{
function bar()
{
echo "I don't exist until insert_dynamic() is called.\n";
}
}
/* 现在还不能调用bar()函数,因为它还不存在 */
insert_dynamic();
/* 现在可以调用bar()函数了,因为insert_dynamic()函数
的执行使得bar()函数变为已定义的函数 */
bar();
参数传递的方式有两种:传值方式和传址方式。
①传值方式: 这是默认方式。将实参的值复制到对应的形参中,在函数内部的操作针对形参进行操作的结果不会影响到实参,即函数返回后,实参的值不会改变。
②传址方式: 实参的内存地址传递到形参中,在函数内部的所有操作都会影响到实参的值,即返回后,实参的值会相应发生变化。在传址时只需要在形参前加&号
function add_some_extra(&$string) //定义函数,参数是 string
{
$string .= "我是DMIND"; //参数变量赋值
}
$str = "你好, "; //变量赋值
add_some_extra($str); //运行函数
echo $str; //输出变量值
?>
//结果:你好,我是DMIND
is_array:判断变量类型是否为数组类型。
is_double:判断变量类型是否为浮点数类型。
is_float:判断变量类型是否为浮点数类型。
is_int:判断变量类型是否为整数类型。
is_integer:是上面函数 is_int 的别名,用于判断变量类型是否为整数类型。
is_long:判断变量类型是否为长整数类型。
is_object:判断变量类型是否为类类型。
is_real:判断变量类型是否为实数类型。
is_string:判断变量类型是否为字符串类型。
isset:判断变量是否已配置。
settype:配置变量类型。
strval:将变量转成字符串类型。
unset:删除变量。
一般情况下,PHP 脚本的扩展名为 php、php4、php5。用这些扩展名可以表示脚本的类型或者版本,从而让 PHP 解析器解析。
如在 Apache 服务器中是通过配置 httpd.conf 配置文件来指定 PHP 解析器能解析哪些扩展名的脚本文件
AddType application/x-httpd-php .php .php4 .php5
require('common_inc.php')
require("common_inc.php")
require 'common_inc.php'
require "common_inc.php"
建议使用括号单引号('')的方式引入文件。
require_once、include_once
会先检查该引用文件是否已经引用到脚本中,如果没有则引用,反之则跳过而不会引用
require
引入就加载,无条件包含
include
用到才加载,有条件包含,可以放在流程控制语句。
require
致命错误,直接终止
include
Warning,继续执行
include 不仅可以引入和运行本地文件。还可以通过 URL 来引入和运行远端服务器上的文件
而且当 php.ini 中的 allow_url_fopen
和 allow_url_include
都设置为 On 时,可以通过 URL 来引入和运行远端服务器上的文件
对于 MVC 模式中的三个组成部分,它们既是相互独立的个体,又是相互关联的一个整体。
首先 View 和 Controller 都要向 Model 请求数据,所以 Controller 和 View 都依赖于 Model;其次任何输入数据(包括请求命令)都通过 Controller 进入 Web 系统,最后 Controller 通过一个 View 来发布结果数据
View 是 Web 服务器传送给客户端浏览器的显示数据,如用脚本生成的 HTML 代码等。它可以处理所有表现层方面的问题,首先 View 从 Model 处获得数据,并将其格式化为 HTML 代码提供给客户端使用。一般不会让View直接随意调用Model的方法来改变状态,应该只使用 Controller 来控制 Model,操作其方法,改变其状态
在设计模式中常常会用到两种视图:模板视图(Template View)和转换视图(Transform View)。
Model 是程序逻辑和数据,也称为业务层,它不包含任何 View 的特性,所以它和 HTTP 协议中的请求等处理没有一点关系。
注意:在PHP MVC的Model 中一定不能出现 HTML
标签或$_POST
等超全局变量
Model 的主要工作就是把原有的相对无序的数据转换成相对有序和包含一定意义的数据,并将转化后的数据传送给 View,供其使用。
一般Model将封装数据查询,可以通过一些抽象数据类来实现查询。
Controller 是大多数 PHP MVC 框架最为关注的部分之一,它用于控制程序流程,接收输入数据,并将它们传送给 Model 和 View,还可以触发 Model 的数据和 View 元素之间的绑定的控件。
在设计模式中常常会用到两种控制器:前端控制器(Front Controller) 和应用控制器(Application Controller)。
1.在使用 session 之前,首先要调用 session_start( )
函数打开一个 session。且在此之前浏览器不能有任何输出,否则会产生错误
session_start();
必须在调用
session_start( )
之前调用与session有关的ini_set( )
2.通过php.ini
中的 session. auto_start => 1
来打开自动 session
$_SESSION
本质上是一个标准的数组,可以像数组那样写入和读取数据
①删除单个会话。 unset()
函数实现。
unset ( $_SESSION['user'] ) ;
注意$SESSION
数组中的键值不能省略,忽略会导致整个$SESSION
变量被销毁
② 删除多个会话。给数组赋空实现,将整个会话变量直接销毁。
$_SESSION= array();
③ 结束当前会话。session_destroy()
彻底销毁SESSION,释放资源
session_destroy();
session_save_path($path);
$path = "/tmp/"; // 设置 Session 存储路径
session_save_path($path);
session_start(); // 初始化 Session
$_SESSION[username] = true;
echo "Session 文件名称为:sess_".session_id();
?>
//输出:Session 文件名称为:sess_u8bk1j7c6uuj3dlb3rj363r374
★ $_FILES[$uploadfile][『name』]:表示从客户端传上来的文件的原名称
★ $_FILES[$uploadfile][『type』]:表示从客户端传上来的文件的类型
★ $_FILES[$uploadfile][『size』]:表示从客户端传上来的文件的大小
★ $_FILES[$uploadfile][『tmp_name』]:表示文件被上传后在服务器上储存的临时文件名(包含绝对路径)。
★ $_FILES[$uploadfile][『error』]:表示该文件上传出错后的错误代码
当使用
move_uploaded_file()
函数移动文件时,如果目标文件已经存在,将会被覆盖。
★ 「PHP_SELF」:表示当前正在执行脚本的文件名。
★ 「argv」:表示当调用 GET 方法时传递给该脚本的参数。
★ 「argc」:表示传递给程序的命令行参数的个数(如果是运行在命令行模式)。
★ 「GATEWAY_INTERFACE」:表示服务器使用的 CGI 规范的版本,如「CGI/1.1」。
★ 「SERVER_NAME」:表示当前运行脚本所在服务器主机的名称,如果该脚本运行在一个虚拟主机上,该名称是由那个虚拟主机所设置的值决定的。
★ 「SERVER_SOFTWARE」:表示服务器标识的字串。
★ 「SERVER_PROTOCOL」:表示请求页面时通信协议的名称和版本,如「HTTP/1.0」。
★ 「REQUEST_METHOD」:表示访问页面时的请求方法,如:「GET」、「POST」、「PUT」。
★ 「REQUEST_TIME」:表示请求开始时的时间戳。
★ 「QUERY_STRING」:表示客户端查询的字符串,也就是 URL 中第一个问号?之后的内容。
★ 「DOCUMENT_ROOT」:表示当前运行脚本所在的文档根目录,在 Web 服务器配置文件中定义。
★ 「HTTP_ACCEPT」:表示当前请求的 Accept:头信息的内容。
★ 「HTTP_ACCEPT_CHARSET」:表示当前请求的 Accept-Charset:头信息的内容,如「iso-8859-1,*,utf-8」。
★ 「HTTP_ACCEPT_ENCODING」:表示当前请求的 Accept-Encoding:头信息的内容,如「gzip」。
★ 「HTTP_ACCEPT_LANGUAGE」:表示当前请求的 Accept-Language:头信息的内容,如「en」。
★ 「HTTP_CONNECTION」:表示当前请求的 Connection:头信息的内容,如「Keep-Alive」。
★ 「HTTP_HOST」:表示当前请求的 Host:头信息的内容。
★ 「HTTP_REFERER」:表示链接到当前页面的前一页面的 URL 地址。不是所有的用户代理(浏览器)都会设置这个变量,有的还可以手工修改 HTTP_REFERER。因此,这个变量不总是真实有效的。
★ 「HTTP_USER_AGENT」:表示当前请求的 User-Agent:头信息的内容,该字符串表明了访问该页面的用户代理的信息。
★ 「HTTPS」:表示如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。
★ 「REMOTE_ADDR」:表示正在浏览当前页面用户的 IP 地址。
★ 「REMOTE_HOST」:表示正在浏览当前页面用户的主机名。
★ 「REMOTE_PORT」:表示用户连接到服务器时所使用的端口。
★ 「SCRIPT_FILENAME」:表示当前执行脚本的绝对路径名。
★ 「SERVER_ADMIN」:表示 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。
★ 「SERVER_PORT」:表示服务器所使用的端口,默认为「80」。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
★ 「SERVER_SIGNATURE」:表示包含服务器版本和虚拟主机名的字符串。
★ 「PATH_TRANSLATED」:表示当前脚本所在文件系统(不是文档根目录)的基本路径。
★ 「SCRIPT_NAME」:表示包含当前脚本的路径,这在页面需要指向自己时非常有用。__FILE__ 包含当前文件的绝对路径和文件名(例如包含文件)。
★ 「REQUEST_URI」:表示访问此页面所需的 URI,如,「/index.html」。
★ 「PHP_AUTH_DIGEST」:当作为 Apache 模块运行时,进行 HTTP Digest 认证的过程中,此变量被设置成客户端发送的「Authorization」HTTP 头内容。
★ 「PHP_AUTH_USER」:当 PHP 运行在 Apache 或 IIS(PHP5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
★ 「PHP_AUTH_PW」:当 PHP 运行在 Apache 或 IIS(PHP5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
★ 「AUTH_TYPE」:当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。
bool file_exists ( string filename ) ;
var_dump(file_exists('/tmp/'));
注意:打开文件前应该判断文件是否存在
int fopen (string filename,string mode [,int use_include_path [ ,resourcezcontext]]);
fopen('/tmp/1.txt','r')
bool fclose ( resource handle ) ;
fwrite()
和fputs()
fwrite ( resource $handle , string $string , int $length = ? ) : int
$hello = "test/write.txt" ; //定义变量,设置文件的名字
$php = "Hello PHP!" ; //定义字符串变量
if ( !$yes = fopen ( $hello,"a" ))//使用添加模式打开文件,文件指针指在表尾
{
print"不能打开 $hello"; //输出提示
exit ;
}else{
//如果打开成功
print"打开成功!
"; //输出提示
}
if(!fwrite($yes,$php)) //将 $php 写入到文件夹中,如果写入失败
{
print "不能写入 $php" ; //输出提示
exit ;
}
print "写入成功!
"; //输出提示
fclose ( $yes); //关闭操作
?>
fgetc()
从文件句柄中获取一个字符。
fgetc ( resource $handle ) : string
$fp = fopen('somefile.txt', 'r');
if (!$fp) {
echo 'Could not open file somefile.txt';
}
while (false !== ($char = fgetc($fp))) {
//循环地获取单个字符
echo "$char\n";
}
?>
函数
fgetc()
一次只能操作一个字符,汉字占用两个字符的位置。所以在读取一个汉字的时候,如果只读取一个字符就会出现乱码。
读取任意长度字符的函数 fread()
fread ( resource $handle , int $length ) : string
fread()
从文件指针 handle 读取最多 length 个字节
1.fgets()
读取一行数据,$length指定读取该行的 length-1个字节
fgets ( resource $handle , int $length = ? ) : string
2.fgetss()
类似fgets(),从文件指针中读取一行并过滤掉 HTML 标记
fgetss ( resource $handle , int $length = ? , string $allowable_tags = ? ) : string
fgets()和fgetss()对比:
$file=fopen('./1.txt','w+');
fwrite($file,'1
');
fwrite($file,'2
');
fwrite($file,'3
');
fclose($file);
$read=fopen('./1.txt','r');
while(!feof($read)){
echo "fgets():".fgets($read,1024);//读取1024个字节
}
fclose($read);
$read=fopen('./1.txt','r');
while(!feof($read)){
$line=fgetss($read,1024);
echo "fgetss():$line";
}
fclose($read);
?>
3.fgetcsv()
,只除了 fgetcsv() 解析读入的行并找出 CSV 格式的字段然后返回一个包含这些字段的数组。
fgetcsv ( resource $handle , int $length = 0 , string $delimiter = ',' , string $enclosure = '"' , string $escape = '\\' ) : array
$file=fopen('./1.txt','w+');
fwrite($file,'1234567XXXXX89');
fclose($file);
$row = 1 ;
$shili = fopen ( "1.txt","r" ) ; //打开指定的文件
while ( $shi = fgetcsv ($shili,10,"\t" )) //从文件指针中读取一行的10个字节
{
$num = count( $shi ) ; //统计操作
print " 在第 $row 行的字段 :
"
; //显示第几行的提示
$row++ ; //逐行读取
for ( $c=0; $c<$num; $c++ )
print $shi[$c] . "
"; //显示每一行的内容
}
fclose ($shili ); //关闭操作
readfile()
读取文件并写入到输出缓冲。返回值:成功时返回从文件中读入的字节数, 或者在失败时返回 false
readfile ( string $filename , bool $use_include_path = false , resource $context = ? ) : int
fpassthru()
将给定的文件指针从当前的位置读取到 EOF 并把结果写到输出缓冲区。
fpassthru ( resource $handle ) : int
当在 Windows 系统中用函数 fpassthru()读取二进制文件时,要确保用 fopen()打开这个文件,并且在 mode 中附加「b」选项来将文件以二进制方式打开。在处理二进制文件时使用「b」标志,这样可以使脚本的移植性更好。
file_get_contents()
将整个文件读入一个字符串
file_get_contents ( string $filename , bool $use_include_path = false , resource $context = ? , int $offset = -1 , int $maxlen = ? ) : string
函数
file_get_contents()
适用于二进制对象,可以将整个文件的内容读入到一个字符串中,从参数 offset 所指定的位置开始,读取长度为「maxlen」的内容。失败时返回 false。
file()
把整个文件读入一个数组中。
file ( string $filename , int $flags = 0 , resource $context = ? ) : array
函数
file()
将文件作为一个数组返回,数组中每个单元都是文件中相应的一行,包括换行符在内。失败时返回 false。如果想在 filename 中搜寻文件,可以将可选参数 use_include_path 设为「1」。
读取一张图片:
$file = 'E:\视频\图片\Saved Pictures\小动物.PNG\2.png' ; //定义文件名变量
$yes = fopen($file,'rb'); //二进制打开文件
header ("content-type:image/png");//发送 html 头,表示发送二进制数据
header("content_length:".filesize($file));//获取文件的大小
fpassthru($yes);//读取文件
//readfile($file);
exit ;
fclose($yes);
?>
ftell()
返回由 handle 指定的文件指针的位置,也就是文件流中的偏移量。
ftell ( resource $handle ) : int
$file = fopen('./1.txt','r');
echo "fgets():".fgets($file,4)."
";
echo "ftell():".ftell($file);
fclose($file);
?>
rewind()
将 handle 的文件位置指针设为文件流的开头。
rewind ( resource $handle ) : bool
fseek()
在文件指针中定位
fseek ( resource $handle , int $offset , int $whence = SEEK_SET ) : int
fseek($fp, 0);将文件指针$fp的指针位置指定到开头
opendir()
打开目录句柄
opendir ( string $path , resource $context = ? ) : resource
readdir()
返回目录中下一个文件的文件名。成功则返回文件名 或者在失败时返回 false。
readdir ( resource $dir_handle = ? ) : string
$dir='E:/phpstudy/PHPTutorial/WWW/test/';
if (is_dir($dir)){
$dh=opendir($dir);
echo "$dh
";
while(FALSE !== ($filename=readdir($dh))){
//先判断不全等为FALSE,否则任何目录项的名称值为 false 的都会导致循环停止(例如一个目录名为“0”)
echo "$filename
";
}
closedir($dh);
}
?>
首先了解Directory类:
Directory {
/* 属性 */
public string $path ; //目录句柄
public resource $handle ; //被打开目录的地址
/* 方法 */
public close ( resource $dir_handle = ? ) : void
public read ( resource $dir_handle = ? ) : string
public rewind ( resource $dir_handle = ? ) : void
}
dir()、read()、close()
分别等价于:
opendir()、readdir()、closedir()
dir()是类 Directory 的构造函数,实例化Directory类
$d= dir("E:/phpstudybak/phpstudy/PHPTutorial/WWW/test/");
echo "handle:$d->handle
";
echo "path:$d->path
";
while (FALSE !== ($filename=$d->read())){
echo $filename."
";
}
$d->close();
?>
mkdir()
—创建目录函数
mkdir ( string $pathname , int $mode = 0777 , bool $recursive = false , resource $context = ? ) : bool
mode:默认是 0777,意味着最大可能的访问权
is_dir()
—检查目录合法性函数
is_dir ( string $filename ) : bool
rmdir()
—删除目录
rmdir ( string $dirname , resource $context = ? ) : bool
chdir()
—改变目录到新的目录
chdir ( string $directory ) : bool
getcwd()
— 取得当前工作目录
getcwd () : string|false
每一个 try 至少要有一个与之对应的 catch。
使用多个 catch可以捕获不同的类所产生的异常。
当一个异常被抛出时,其后(指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的 catch。
如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught Exception … (未捕获异常)的提示信息。
Exception类:
/**
* Exception.php
*
* PHP5内置的异常类的属性与方法
* 以下这段代码只为说明内置异常处理类的结构,它并不是一段有实际意义的可用代码。
*/
class Exception{
protected $message = 'Unknown exception'; // 异常信息
protected $code = 0; // 用户自定义异常代码
protected $file; // 发生异常的文件名
protected $line; // 发生异常的代码行号
function __construct($message = null, $code = 0);
final function getMessage(); // 返回异常信息
final function getCode(); // 返回异常代码(代号)
final function getFile(); // 返回发生异常的文件名
final function getLine(); // 返回发生异常的代码行号
final function getTrace(); // backtrace() 数组
final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息
//可重载的方法
function __toString(); // 可输出的字符串
}
?>
try{
$error = '这是一个异常信息!';
throw new Exception($error); //抛出一个异常类,且包含错误信息
echo "throw后面的不会执行了";
}
catch(Exception $e){
//捕获,进行异常处理
echo "捕获异常:".$e->getMessage()."
";
}
echo "继续执行正常代码"; //执行常规代码
?>
throw
语句必须在try
语句块作用域内才有意义。