在php中获取文件的mime类型方法有很多种,我们来介绍直接利用mime_content_type()函数判断获取mime类型即可了。
mime_content_type返回指定文件的MIME类型,
用法:
代码如下 |
复制代码 |
echo mime_content_type ( 'php.gif' ) . "n" ;
echo mime_content_type ( 'test.php' );
|
输出:
image/gif
text/plain
但是此函数在php5.3.0以后就不可用了,如果你是php5.3.0以后版本我们可使用
代码如下 |
复制代码 |
$finfo = finfo_open(FILEINFO_MIME);
$mimetype = finfo_file($finfo, $filename);
finfo_close($finfo);
|
来操作
下面介绍用户自定的我这个是没有php版本限制的。
代码如下 |
复制代码 |
<?php
$mime = array (
//applications
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'exe' => 'application/octet-stream',
'doc' => 'application/vnd.ms-word',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'pps' => 'application/vnd.ms-powerpoint',
'pdf' => 'application/pdf',
'xml' => 'application/xml',
'odt' => 'application/vnd.oasis.opendocument.text',
'swf' => 'application/x-shockwave-flash',
// archives
'gz' => 'application/x-gzip',
'tgz' => 'application/x-gzip',
'bz' => 'application/x-bzip2',
'bz2' => 'application/x-bzip2',
'tbz' => 'application/x-bzip2',
'zip' => 'application/zip',
'rar' => 'application/x-rar',
'tar' => 'application/x-tar',
'7z' => 'application/x-7z-compressed',
// texts
'txt' => 'text/plain',
'php' => 'text/x-php',
'html' => 'text/html',
'htm' => 'text/html',
'js' => 'text/javascript',
'css' => 'text/css',
'rtf' => 'text/rtf',
'rtfd' => 'text/rtfd',
'py' => 'text/x-python',
'java' => 'text/x-java-source',
'rb' => 'text/x-ruby',
'sh' => 'text/x-shellscript',
'pl' => 'text/x-perl',
'sql' => 'text/x-sql',
// images
'bmp' => 'image/x-ms-bmp',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'gif' => 'image/gif',
'png' => 'image/png',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'tga' => 'image/x-targa',
'psd' => 'image/vnd.adobe.photoshop',
//audio
'mp3' => 'audio/mpeg',
'mid' => 'audio/midi',
'ogg' => 'audio/ogg',
'mp4a' => 'audio/mp4',
'wav' => 'audio/wav',
'wma' => 'audio/x-ms-wma',
// video
'avi' => 'video/x-msvideo',
'dv' => 'video/x-dv',
'mp4' => 'video/mp4',
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'mov' => 'video/quicktime',
'wm' => 'video/x-ms-wmv',
'flv' => 'video/x-flv',
'mkv' => 'video/x-matroska'
);
function _getMimeDetect() {
if (class_exists('finfo')) {
return 'finfo';
} else if (function_exists('mime_content_type')) {
return 'mime_content_type';
} else if ( function_exists('exec')) {
$result = exec('file -ib '.escapeshellarg(__FILE__));
if ( 0 === strpos($result, 'text/x-php') OR 0 === strpos($result, 'text/x-c++')) {
return 'linux';
}
$result = exec('file -Ib '.escapeshellarg(__FILE__));
if ( 0 === strpos($result, 'text/x-php') OR 0 === strpos($result, 'text/x-c++')) {
return 'bsd';
}
}
return 'internal';
}
function _getMimeType($path) {
global $mime;
$fmime = _getMimeDetect();
switch($fmime) {
case 'finfo':
$finfo = finfo_open(FILEINFO_MIME);
if ($finfo)
$type = @finfo_file($finfo, $path);
break;
case 'mime_content_type':
$type = mime_content_type($path);
break;
case 'linux':
$type = exec('file -ib '.escapeshellarg($path));
break;
case 'bsd':
$type = exec('file -Ib '.escapeshellarg($path));
break;
default:
$pinfo = pathinfo($path);
$ext = isset($pinfo['extension']) ? strtolower($pinfo['extension']) : '';
$type = isset($mime[$ext]) ? $mime[$ext] : 'unkown';
break;
}
$type = explode(';', $type);
//需要加上这段,因为如果使用mime_content_type函数来获取一个不存在的$path时会返回'application/octet-stream'
if ($fmime != 'internal' AND $type[0] == 'application/octet-stream') {
$pinfo = pathinfo($path);
$ext = isset($pinfo['extension']) ? strtolower($pinfo['extension']) : '';
if (!empty($ext) AND !empty($mime[$ext])) {
$type[0] = $mime[$ext];
}
}
return $type[0];
}
$path = '1.txt'; //实际上当前路径并不存在1.txt
var_dump(_getMimeType($path));
/*End of php*/
|
在很多时候我们会碰到在字符串有会有空格,而这些空格不是我们想要的我们要怎么清除呢,下面我来介绍利用正则表达式来清除字符串中空白的办法。
先利用trim系列函数来删除左右空格
代码如下 |
复制代码 |
<?php
trim 去除一个字符串两端空格,
rtrim 是去除一个字符串右部空格,
ltrim 是去除一个字符串左部空格。
echo trim(" 空格 ")."<br>";
echo rtrim(" 空格 ")."<br>";
echo ltrim(" 空格 ")."<br>";
?>
|
删除所有空格不能使用php trim()函数,因类他也只能是去除两边空闲
代码如下 |
复制代码 |
function trimall($str)//删除空格
{
$qian=array(" "," ","t","n","r");
$hou=array("","","","","");
return str_replace($qian,$hou,$str);
}
|
上面只能删除是一些常见的空格了,下面分享一个更具体的。
代码如下 |
复制代码 |
$str = " This line containstliberal rn use of whitespace.nn";
// First remove the leading/trailing whitespace
//去掉开始和结束的空白
$str = trim($str);
// Now remove any doubled-up whitespace
//去掉跟随别的挤在一块的空白
$str = preg_replace('/s(?=s)/', '', $str);
// Finally, replace any non-space whitespace, with a space
//最后,去掉非space 的空白,用一个空格代替
$str = preg_replace('/[nrt]/', ' ', $str);
// Echo out: 'This line contains liberal use of whitespace.'
echo "<pre>{$str}</pre>";
|
中间就是利用了替换连续空格与左右空格之后再利用preg_replace替换去除重复的,然后再用另一个正则表达式[nrt]来查找任何残余的换行符(n), 回车(r), 或制表符(t) 即可。
在php中魔术方法与关键字都是我们常用的,关键字有final、static 、const,魔术方法__call()、__toString() 、_clone() 、__autoload() 等等。
PHP中常用的关键字
final
1、final只能修饰类和方法,不能修饰成员属性 作用:使用修饰的类不能被继承,修饰的方法不能被覆盖
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被声明为
final,则不能被继承。
Example #1 Final 方法示例
代码如下 |
复制代码 |
<?php
class BaseClass {
public function test() {
echo "BaseClass::test() called\n";
}
final public function moreTesting() {
echo "BaseClass::moreTesting() called\n";
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called\n";
}
}
// 产生 Fatal error: Cannot override final method BaseClass::moreTesting()
?>
Example #2 Final 类示例
<?php
final class BaseClass {
public function test() {
echo "BaseClass::test() called\n";
}
// 这里无论你是否将方法声明为final,都没有关系
final public function moreTesting() {
echo "BaseClass::moreTesting() called\n";
}
}
class ChildClass extends BaseClass {
}
// 产生 Fatal error: Class ChildClass may not inherit from final class (BaseClass)
?>
|
static
1.使用static可以修饰成员属性和成员方法,不能修饰类
2.用static修饰的成员属性,可以被同一个类的所有对象共享
3.静态的数据是存在于内存中的数据段中(初使化静态段)
4.静态的数据是在类第一次加载时分配到内存中的,后面用到时就可以直接使用了
5.只要在程序中有这个类名出现,即是类被加载,静态数据就会被分配到内存中了 注:静态的成员都要使用类名访
问,不用创建对象,不要用对象去访问静态成员。 访问方法 类名::静态成员 如果在类中使用静态成员,可以使
用self代表本类 访问方法 self::静态成员
6.静态方法不能访问非静态成员,非静态方法可以访问静态成员,因为非静态成员必须用对象来访问,而静态成员不需
要
例1
代码如下 |
复制代码 |
<?php
function test()
{
static $var1=1;
$var1+=2;
echo $var1.' ';
}
test();
test();
test();
?>
|
例2
例子:
代码如下 |
复制代码 |
<?php
Class Person{
// 定义静态成员属性
public static $country = "中国";
// 定义静态成员方法
public static function myCountry() {
// 内部访问静态成员属性
echo "我是".self::$country."人<br />";
}
}
class Student extends Person {
function study() {
echo "我是". parent::$country."人<br />";
}
}
// 输出成员属性值
echo Person::$country."<br />"; // 输出:中国
$p1 = new Person();
//echo $p1->country; // 错误写法
// 访问静态成员方法
Person::myCountry(); // 输出:我是中国人
// 静态方法也可通过对象访问:
$p1->myCountry();
// 子类中输出成员属性值
echo Student::$country."<br />"; // 输出:中国
$t1 = new Student();
$t1->study(); // 输出:我是中国人
?>
|
运行该例子,输出:
中国
我是中国人
我是中国人
中国
我是中国人
首先,我们知道PHP中调用实例方法都是通过如:someobj->someFun()调用,那么我们调用静态函数是否也能像C#那样
通过SomeClass->someFun()调用呢?答案是否定的,在PHP中,对静态成员的调用只能通过::的方式进行,如:
SomeClass::someFun()。
代码如下 |
复制代码 |
<?php
class TestC
{
public static $var1=1;
public $var2=1;
function t1()
{
self::$var1+=2;
echo self::$var1.' ';
echo $this->var2.' ';
}
public static function t2()
{
self::$var1+=2;
echo self::$var1.' ';
}
}
$t=new TestC();
$t->t1();
TestC::t2();
?> |
const
1.const只能修饰成员属性
2.类中使用const声明常量
3.用法类似定义一般常量
4.访问方式和静态成员是一样的(在类外 类名::常量名,类内 self::常量名)
5.常量一定要在声明时就给初值
语法:
const constant = "value";
例子:
代码如下 |
复制代码 |
<?php
Class Person{
// 定义常量
const country = "中国";
public function myCountry() {
//内部访问常量
echo "我是".self::country."人<br />";
}
}
// 输出常量
echo Person::country."<br />";
// 访问方法
$p1 = new Person();
$p1 -> myCountry();
?>
|
运行该例子输出:
中国
我是中国人
PHP中小常用魔术方法:
__call() 在调用对象中不存在的方法时,就会调用此方法。就会出现系统报错,然后程序会退出。声明此方法来对
错误进行操作,阻止程序崩溃。
__toString() 直接输出对象引用时调用,用来快速获取对象的字符串表示的最便捷的方式
代码如下 |
复制代码 |
<?php
// Declare a simple class
class TestClass
{
public $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
public function __toString() {
return $this->foo;
}
}
$class = new TestClass('Hello');
echo $class;
?>
|
void __clone ( void )
当复制完成时, 如果定义了__clone()方法, 则新创建的对象(复制生成的对象)中的__clone()方法会被调用, 可
用于修改属性的值(如果有必要的话)。
代码如下 |
复制代码 |
<?php
class SubObject
{
static $instances = 0;
public $instance;
public function __construct() {
$this->instance = ++self::$instances;
}
public function __clone() {
$this->instance = ++self::$instances;
}
}
class MyCloneable
{
public $object1;
public $object2;
function __clone()
{
// 强制复制一份this->object, 否则仍然指向同一个对象
$this->object1 = clone $this->object1;
}
}
$obj = new MyCloneable();
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone $obj;
print("Original Object:\n");
print_r($obj);
print("Cloned Object:\n");
print_r($obj2);
?>
|
__autoload() 其它的魔术方法都是在类中添加起作用,这个是唯一一个不在类中添加的方法 只要在页面中使用
到一个类,只要用到类名就会自动传进此方法
代码如下 |
复制代码 |
<?php
session_start();
require_once 'MyClass.php';
$obj = new MyClass;
$_SESSION['obj'] = $obj;
?>
|
Works fine. Then on a subsequent page load:
代码如下 |
复制代码 |
<?php
session_start();
require_once 'MyClass.php';
$_SESSION['obj']->callSomeMethod();
?>
|
Fatal error: The script tried to execute a method or access a property of an incomplete object. Please
ensure that the class definition "MyClass" of the object you are trying to operate on was loaded
_before_ unserialize() gets called or provide a __autoload() function to load the class definition.
But if you do this instead, it works fine:
代码如下 |
复制代码 |
<?php
require_once 'MyClass.php';
session_start();
$_SESSION['obj']->callSomeMethod();
?>
|
对象串行化:将一个对象转化为二进制串 1.将对象长时间存储在数据库或文件中时 2.将对象在多个PHP文件中传
输时 serialize():参数是一个对象,返回的是一个二进制串 unserialize():参数是对象的二进制串,返回的就是
新生成的对象 __sleep() 在序列化时自动调用的方法(serialize) 作用:可以将一个对象部分序列化 只要
这个方法中返回一个数据组,数组中有几个成员属性就序列化几个成员属性,如果不加,所有成员属性都被序列化
__wakeup() 在反序列化时自动调用的方法(unserialize) 也就是对象重新诞生的一个过程
注意事项:PHP把所有以__(两个下划线)开头的类方法当成魔术方法。所以当你定义类方法时,除了上述魔术方法,
建议不要以 __为前缀。
在php中我们有大量的可对文件与目录操作的函数,下面我来总结一下这些函数的用法,有需要学习的朋友可参考参考。
mkdir();函数
php创建文件夹和文件
///创建文件夹
代码如下 |
复制代码 |
function createdir($dir)
{
if(file_exists($dir) && is_dir($dir)){//如果存在这个文件并且这个文件是个目录就不动作
}
else{
mkdir($dir,0777);//否则就创造这个目录
}
} |
file_exists();函数
file_exists -- 检查文件或目录是否存在
代码如下 |
复制代码 |
<?php
$filename = '/path/to/foo.txt';
if (file_exists($filename)) {
print "The file $filename exists";
} else {
print "The file $filename does not exist";
}
?>
|
is_dir();函数
is_dir();测试文件是否为目录。
为目录就返回true,不就返回false
is_file();
Is_File('目标文件路径和文件名')
为文件返回"True",不为文件返回"False"。
is_link();
文件系统函数库
is_link();测试文件是否为链接文件。
true 值则表示指定的 filename 存在并为符号链接文件.
rmdir 命令
功能:删除空目录
rmdir [选项] dirname
- p 递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。如果整个路径被删除或者由于某种原因
保留部分路径,则系统在标准输出上显示相应的信息。
要清空并除去目录,请输入:
rm mydir/* mydir/.*
rmdir mydir
该命令除去 mydir 文件中的内容接着除去空目录。rm 命令显示一条关于尝试除去目录 .(点)和.. (点,点)的错
误消息,然后 rmdir 命令除去它们。
建立一个文件名字为aa.txt
代码如下 |
复制代码 |
$fp=fopen('aa.txt', 'w+'); //建立一新文件
chmod('aa.txt', 0777); //设定权限,不然的话建立后无法修改,删除 //好象这行不用也可以
fwrite($fp, '要写入的内容'); //写内容
fclose($fp); //关闭文件
|
unlink()函数
功能:删除文件
unlink($filename)删除文件名为$filename的文件
删除指定目录下的所有文件
代码如下 |
复制代码 |
function dir_clear($dir) {
$directory = dir($dir); //创建一个dir类(Php手册上这么说的),用来读取目录中的每一个文
件
while($entry = $directory->read()) { //循环每一个文件,并取得文件名$entry
$filename = $dir.'/'.$entry; //取得完整的文件名,带路径的
if(is_file($filename)) { //如果是文件,则执行删除操作
@unlink($filename);
}
}
$directory->close(); //关闭读取目录文件的类
result();
}
|
列出目录中包括子目录的所有文件程序
代码如下 |
复制代码 |
<?php
/*
* PHP 读取目录下及其子目下的文件函数
* */
$files=getFile("images");//调用函数
foreach ($files as $name){
echo "$name"."<br>";
}
function getFile($dir){
$files=array();
if (is_file($dir)){//如果指定路径为文件直接返回
return $dir;
}
$hande=opendir($dir);
if ($hande){
while (false!==($ufile=readdir($hande))){//如果读取目录成功
if ($ufile!="." && $ufile!=".."){
$filename=$dir."/".$ufile;
if (is_file($filename)){
$files[]=$filename;
}else{
$files=array_merge($files,getFile($filename));
}
}
}//end While
closedir($hande);
}//end if
return $files;
}
?>
|
删除指定目录下的所有文件以及所有文件夹以及本身***强烈推荐这种方法!!!
代码如下 |
复制代码 |
function rmdir_tree($dirname)//定义一个函数rmdir_tree,要删除的文件名为$dirname
{
$handle=opendir($dirname);//打开名为$dirname的文件夹
while ($file=readdir($handle)) //跑回圈读取打开的文件夹
{
if (($file==".") || ($file=="..")) continue;//继续跑的条件,如果不满足就不跑了
$fullname=$dirname."/".$file;//完整的文件名(包括路径)
if (filetype($fullname)=="dir")
rmdir_tree($fullname);//调用刚刚定义的函数,实现递归
else
unlink($fullname);//删除文件
}
closedir($handle);//关闭打开了的文件夹
rmdir($dirname);//删除自身(文件夹)
} |
昨天有一朋友说自己的phpmyadmin不能登录并且无任何提示了,问我怎么解决,下面我来分享一下关于phpmyadmin不能登录问题总结.
phpmyadmin不能登录没有提示
解决方法:
1.在php的目录建立个文件夹tmp(如C:/php/tmp),设置tmp属性为ervery one完全控制
2.在php.ini找到session.save_path 这一行,设成session.save_path = “C:/php/tmp”,并把前面的分号去掉
以上的C:/php/tmp根据你实际情况设定
3.重启IIS服务。
终极解决方法
导致上述问题和一些与php程序相关的错误(如:xcache缓存功能不生效;php不保存session),根源在于,没有给php设
置temp目录!
1.在 c:windows下建立 temp 文件夹(用户存放php的文件),并设置相应的读写NTFS权限,确保php能正常访问此
目录
2.重启IIS.
简单带上phpMyAdmin登陆超时(1440秒未活动)解决办法
在phpMyAdmin所在目录找到 / libraries / config.default.php 文件,打开,修改
$cfg['LoginCookieValidity'] = 1440; 将1440修改成更大的值即可解决“现象一”
如果修改:$cfg['LoginCookieValidity']的值小于或等于php.ini里的session.gc_maxlifetime的值,即可解决”现
象二“
总结:最前讲述的是iis+php下重启iis,如果是apache我们重启apache即可了。
标签:[!--infotagslink--]