转载-ThinkPHP文件上传类的分享

 更新时间:2016年11月25日 16:24  点击:1706

上传类使用ORG类库包中的Net.UpdateFile类,最新版本的上传类包含的功能如下(有些功能需要结合ThinkPHP系统其他类库):

1.基本上传功能

2.支持批量上传

3.支持生成图片缩略图

4. 自定义参数上传

5.上传检测(包括大小、后缀和类型)

6.支持上传类型、附件大小、上传路径定义

7.支持哈希或者日期子目录保存上传文件

8.上传图片的安全性检测

9.支持上传文件命名规则

10. 支持对上传文件的Hash验证


在ThinkPHP中使用上传功能无需进行特别处理。例如,下面是一个带有附件上传的表单提交:

 代码如下 复制代码
<form METHOD=POST action=“/Manual/upload” enctype=“multipart/form-data” >
<input type=“text” NAME=“name” >
<input type=“text” NAME=“email” >
<input type=“file” name=“photo” >
<input type=“submit” value=“保 存” >
</form>

 

注意表单的Form标签中一定要添加 enctype=”multipart/form-data” 文件才能上传。因为表单提交到当前模块的upload操作方法,所以我们在模块类里面添加下面的upload方法即可:

 代码如下 复制代码
Public function upload(){
import(“ORG.Net.UploadFile”);
$upload = new UploadFile(); // 实例化上传类
$upload->maxSize = 3145728 ; // 设置附件上传大小
$upload->allowExts = array(‘jpg’, ‘gif’, ‘png’, ‘jpeg’); // 设置附件上传类型
$upload->savePath = ‘./Public/Uploads/’; // 设置附件上传目录
if(!$upload->upload()) { // 上传错误 提示错误信息
$this->error($upload->getErrorMsg());
}else{ // 上传成功 获取上传文件信息
$info = $upload->getUploadFileInfo();
}
// 保存表单数据 包括附件数据
$User = M(“User”); // 实例化User对象
$User->create(); // 创建数据对象
$User->photo = $info[0]["savename"]; // 保存上传的照片 根据需要自行组装
$User->add(); // 写入用户数据到数据库
$this->success(“数据保存成功!”);
}

 

首先是实例化上传类

 代码如下 复制代码
import(“ORG.Net.UploadFile”);
$upload = new UploadFile(); // 实例化上传类

 

实例化上传类之后,就可以设置一些上传的属性(参数),支持的属性有:

maxSize: 文件上传的最大文件大小(以字节为单位)默认为-1 不限大小

savePath:文件保存路径,如果留空会取UPLOAD_PATH常量定义的路径

saveRule:上传文件的保存规则,必须是一个无需任何参数的函数名,例如可以是 time、 uniqid com_create_guid 等,但必须能保证生成的文件名是唯一的,默认是uniqid

hashType:上传文件的哈希验证方法,默认是md5_file

autoCheck:是否自动检测附件,默认为自动检测

uploadReplace:存在同名文件是否是覆盖

allowExts:允许上传的文件后缀(留空为不限制),使用数组设置,默认为空数组

allowTypes:允许上传的文件类型(留空为不限制),使用数组设置,默认为空数组

thumb:是否需要对图片文件进行缩略图处理,默认为false

thumbMaxWidth:缩略图的最大宽度,多个使用逗号分隔

thumbMaxHeight:缩略图的最大高度,多个使用逗号分隔

thumbPrefix:缩略图的文件前缀,默认为thumb_   (如果你设置了多个缩略图大小的话,请在此设置多个前缀 )

thumbSuffix:缩略图的文件后缀,默认为空   (如果你设置了多个缩略图大小的话,请在此设置多个后缀 )

thumbPath:缩略图的保存路径,留空的话取文件上传目录本身

thumbFile:指定缩略图的文件名

thumbRemoveOrigin:生成缩略图后是否删除原图

autoSub:是否使用子目录保存上传文件

subType:子目录创建方式,默认为hash,可以设置为hash或者date

dateFormat:子目录方式为date的时候指定日期格式

hashLevel:子目录保存的层次,默认为一层

以上属性都可以直接设置,例如:

 代码如下 复制代码
$upload->thumb = true
$upload->thumbMaxWidth = “50,200″
$upload->thumbMaxHeight = “50,200″

 

其中生成缩略图功能需要Image类的支持。

设置好上传的参数后,就可以调用 UploadFile类的upload方法进行附件上传,如果失败,返回false,并且用getErrorMsg方法获取错误提示信息;如果上传成功, 可以通过调用getUploadFileInfo方法获取成功上传的附件信息列表。因此getUploadFileInfo方法的返回值是一个数组,其中 的每个元素就是上传的附件信息。每个附件信息又是一个记录了下面信息的数组,包括:

key:附件上传的表单名称

savepath:上传文件的保存路径

name:上传文件的原始名称

savename:上传文件的保存名称

size:上传文件的大小

type:上传文件的MIME类型

extension:上传文件的后缀类型

hash:上传文件的哈希验证字符串

文件上传成功后,就可以通过这些附件信息来进行其他的数据存取操作,例如保存到当前数据表或者单独的附件数据表都可以。

如果需要使用多个文件上传,只需要修改表单,把

XML/HTML代码

 代码如下 复制代码
<input type=“file” name=“photo”>

改为

XML/HTML代码

 代码如下 复制代码

<input type=“file” name=“photo1″>
<input type=“file” name=“photo2″>
<input type=“file” name=“photo3″>

或者

PHP代码
<input type=“file”  name=“photo[]“ >
<input type=“file”  name=“photo[]“ >
<input type=“file”  name=“photo[]“ >

两种方式的多附件上传系统的文件上传类都可以自动识别。

RSS订阅功能,在很多网站都可以有但也有很多,下面代码是自己写的,其中使用到了一个PHP类:RSS.class.php,感觉非常方便,不敢独享,特拿出来跟大家分享。
 代码如下 复制代码

include_once("class/RSS.class.php");//引入RSS PHP类
$RSS= new RSS("名称","地址","描述","RSS频道图标");
$RSS->AddItem("日志的标题","日志的地址","日志的摘要","日志的发布日期");
$RSS->Display();//输出RSS内容


全部代码如下:

 代码如下 复制代码
<?php
// +----------------------------------------------------------------------
// | YBlog
// +----------------------------------------------------------------------
// | Copyright (c) 2008 http://www.111cn.net/nokia/n97/ All rights reserved.
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | Author: yhustc <yhustc@gmail.com>
// +----------------------------------------------------------------------
// $Id$
 
/**
 +------------------------------------------------------------------------------
 * RSS生成类
 +------------------------------------------------------------------------------
 * @author    yhustc <yhustc@gmail.com>
 * @version   $Id$
 +------------------------------------------------------------------------------
 */
class RSS
{
    /**
     +----------------------------------------------------------
     * RSS频道名
     +----------------------------------------------------------
     * @var string
     * @access protected
     +----------------------------------------------------------
     */
    protected $channel_title = '';
    /**
     +----------------------------------------------------------
     * RSS频道链接
     +----------------------------------------------------------
     * @var string
     * @access protected
     +----------------------------------------------------------
     */
    protected $channel_link = '';
    /**
     +----------------------------------------------------------
     * RSS频道描述
     +----------------------------------------------------------
     * @var string
     * @access protected
     +----------------------------------------------------------
     */
    protected $channel_description = '';
    /**
     +----------------------------------------------------------
     * RSS频道使用的小图标的URL
     +----------------------------------------------------------
     * @var string
     * @access protected
     +----------------------------------------------------------
     */
    protected $channel_imgurl = '';
    /**
     +----------------------------------------------------------
     * RSS频道所使用的语言
     +----------------------------------------------------------
     * @var string
     * @access protected
     +----------------------------------------------------------
     */
    protected $language = 'zh_CN';
    /**
     +----------------------------------------------------------
     * RSS文档创建日期,默认为今天
     +----------------------------------------------------------
     * @var string
     * @access protected
     +----------------------------------------------------------
     */
    protected $pubDate = '';
    protected $lastBuildDate = '';
 
    protected $generator = 'YBlog RSS Generator';
 
    /**
     +----------------------------------------------------------
     * RSS单条信息的数组
     +----------------------------------------------------------
     * @var string
     * @access protected
     +----------------------------------------------------------
     */
    protected $items = array();
 
    /**
     +----------------------------------------------------------
     * 构造函数
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @param string $title  RSS频道名
     * @param string $link  RSS频道链接
     * @param string $description  RSS频道描述
     * @param string $imgurl  RSS频道图标
     +----------------------------------------------------------
     */
    public function __construct($title, $link, $description, $imgurl = '')
    {
        $this->channel_title = $title;
        $this->channel_link = $link;
        $this->channel_description = $description;
        $this->channel_imgurl = $imgurl;
        $this->pubDate = Date('Y-m-d H:i:s', time());
        $this->lastBuildDate = Date('Y-m-d H:i:s', time());
    }
 
    /**
     +----------------------------------------------------------
     * 设置私有变量
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @param string $key  变量名
     * @param string $value  变量的值
     +----------------------------------------------------------
     */
     public function Config($key,$value)
     {
        $this->{$key} = $value;
     }
 
    /**
     +----------------------------------------------------------
     * 添加RSS项
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @param string $title  日志的标题
     * @param string $link  日志的链接
     * @param string $description  日志的摘要
     * @param string $pubDate  日志的发布日期
     +----------------------------------------------------------
     */
     function AddItem($title, $link, $description, $pubDate)
     {
        $this->items[] = array('title' => $title, 'link' => $link, 'description' => $description, 'pubDate' => $pubDate);
     }
 
     /**
     +----------------------------------------------------------
     * 输出RSS的XML为字符串
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @return string
     +----------------------------------------------------------
     */
    public function Fetch()
    {
        $rss = "<?xml version="1.0" encoding="utf-8" ?>rn";
        $rss = "<rss version="2.0">rn";
        $rss .= "<channel>rn";
        $rss .= "<title><![CDATA[{$this->channel_title}]]></title>rn";
        $rss .= "<description><![CDATA[{$this->channel_description}]]></description>rn";
        $rss .= "<link>{$this->channel_link}</link>rn";
        $rss .= "<language>{$this->language}</language>rn";
 
        if (!empty($this->pubDate))
            $rss .= "<pubDate>{$this->pubDate}</pubDate>rn";
        if (!empty($this->lastBuildDate))
            $rss .= "<lastBuildDate>{$this->lastBuildDate}</lastBuildDate>rn";
        if (!empty($this->generator))
            $rss .= "<generator>{$this->generator}</generator>rn";
 
        $rss .= "<ttl>5</ttl>rn";
 
        if (!empty($this->channel_imgurl)) {
            $rss .= "<image>rn";
            $rss .= "<title><![CDATA[{$this->channel_title}]]></title>rn";
            $rss .= "<link>{$this->channel_link}</link>rn";
            $rss .= "<url>{$this->channel_imgurl}</url>rn";
            $rss .= "</image>rn";
        }
 
        for ($i = 0; $i < count($this->items); $i++) {
            $rss .= "<item>rn";
            $rss .= "<title><![CDATA[{$this->items[$i]['title']}]]></title>rn";
            $rss .= "<link>{$this->items[$i]['link']}</link>rn";
            $rss .= "<description><![CDATA[{$this->items[$i]['description']}]]></description>rn";
            $rss .= "<pubDate>{$this->items[$i]['pubDate']}</pubDate>rn";
            $rss .= "</item>rn";
        }
 
        $rss .= "</channel>rn</rss>";
        return $rss;
    }
 
    /**
     +----------------------------------------------------------
     * 输出RSS的XML到浏览器
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @return void
     +----------------------------------------------------------
     */
    public function Display()
    {
        header("Content-Type: text/xml; charset=utf-8");
        echo $this->Fetch();
        exit;
    }
}
?>
本文章介绍了在php中的面向对象中的自动加载类 对象串行化 多态的应用的应用实例,有需要了解的同学可以看看。

自动加载类
很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件。一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表。

在软件开发的系统中,不可能把所有的类都写在一个PHP文件中,当在一个PHP文件中需要调用另一个文件中声明的类时,就需要通过include把这个文件引入。不过有的时候,在文件众多的项目中,要一一将所需类的文件都include进来,是一个很让人头疼的事,所以我们能不能在用到什么类的时候,再把这个类所在的php文件导入呢?这就是我们这里我们要讲的自动加载类。

在 PHP 5 中,可以定义一个 __autoload()函数,它会在试图使用尚未被定义的类时自动调用,通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类, __autoload()函数接收的一个参数,就是你想加载的类的类名,所以你做项目时,在组织定义类的文件名时,需要按照一定的规则,最好以类名为中心,也可以加上统一的前缀或后缀形成文件名,比如xxx_classname.php、classname_xxx.php以及就是classname.php等等.

本例尝试分别从 MyClass1.php 和 MyClass2.php 文件中加载 MyClass1 和 MyClass2 类

 代码如下 复制代码

function __autoload($classname)
{
    require_once $classname . '.php';
}

//MyClass1类不存在自动调用__autoload()函数,传入参数”MyClass1”
$obj  = new MyClass1();

//MyClass2类不存在自动调用__autoload()函数,传入参数”MyClass2”
$obj2 = new MyClass2();


对象串行化
有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,等到达另一端时,再还原为原来的对象,这个过程称之为串行化, 就像我们现在想把一辆汽车通过轮船运到美国去,因为汽车的体积比较大,我们可以把汽车拆开成小的部件,然后我们把这些部件通过轮般运到美国去,到了美国再把这些部件组装回汽车。

有两种情况我们必须把对象串行化,第一种情况就是把一个对象在网络中传输的时候要将对象串行化,第二种情况就是把对象写入文件或是数据库的时候用到串行化。

串行化有两个过程,一个是串行化,就是把对象转化为二进制的字符串,我们使用serialize()函数来串行化一个对象,另一个是反串行化,就是把对象转化的二进制字符串再转化为对象, 我们使用unserialize()函数来反串行化一个对象.

PHP中serialize()函数的参数为对象名,返回值为一个字符串,Serialize()返回的字符串含义模糊,一般我们不会解析这个串来得到对象的信息,我们只要把返回来的这个字符串传到网络另一端或是保存到方件中即可。

PHP中unserialize()函数来反串行化对象,这个函数的参数即为serialize()函数的返回值,输出当然是重新组织好的对象.

 代码如下 复制代码

class Person
{
    //下面是人的成员属性
    var $name;  //人的名子
    var $sex;    //人的性别
    var $age;    //人的年龄

    //定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
    function __construct($name="", $sex="", $age="")
    {
        $this->name=$name;
        $this->sex=$sex;
        $this->age=$age;
    }

    //这个人可以说话的方法, 说出自己的属性
    function say()
    {
        echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."";
    }
}

$p1=new Person("张三", "男", 20);

$p1_string=serialize($p1); //把一个对象串行化,返一个字符串

echo $p1_string."";  //串行化的字符串我们通常不去解析

$p2=unserialize($p1_string);  //把一个串行化的字符串反串行化形成对象$p2

$p2->say();

多态的应用
多态是除封装和继承之外的另一个面象对象的三大特性之一,我个人看来PHP中虽然可以实现多态,但和c++还有Java这些面向对象的语言相比,多态性并不是那么突出,因为PHP本身就是一种弱类型的语言,不存在父类对象转化为子类对象或者是子类对象转化为父类对象的问题,所以多态的应用并不是那么的明显;所谓多态性是指一段程序能够处理多种类型对象的能力,比如说在公司上班,每个月财务发放工资,同一个发工资的方法,在公司内不同的员工或是不同职位的员工,都是通过这个方法发放的,但是所发的工资都是不相同的。所以同一个发工资的方法就出现了多种形态。对于面向对象的程序来说,多态就是把子类对象赋值给父类引用,然后调用父类的方法,去执行子类覆盖父类的那个方法,但在PHP里是弱类型的,对象引用都是一样的不分父类引用,还是子类引用。

我们现在来看一个例子,首先还是要使用多态就要有父类对象和子类对象的关系。做一个形状的接口或是抽象类做为父类,里面有两个抽象方法,一个求周长的方法,另一个是求面积的方法;这接口的子类是多种不同的形状,每个形状又都有周长和面积,又因为父类是一个接口,所以子类里面就必须要实现父类的这两个周长和面积的抽象方法,这样做的目的是每种不同形状的子类都遵守父类接口的规范,都要有求周长和求面积的方法。

 代码如下 复制代码

//定义了一个形状的接口,里面有两个抽象方法让子类去实现
interface Shape
{
    function area();
    function perimeter();
}

//定义了一个矩形子类实现了形状接口中的周长和面积
class Rect implements Shape
{
    private $width;
    private $height;

    function __construct($width, $height)
    {
        $this->width=$width;
        $this->height=$height;
    }

    function area()
    {
        return "矩形的面积是:".($this->width*$this->height);
    }

    function perimeter()
    {
        return "矩形的周长是:".(2*($this->width+$this->height));
    }
}

//定义了一个圆形子类实现了形状接口中的周长和面积
class  Circular implements Shape
{
    private $radius;

    function __construct($radius)
    {
        $this->radius=$radius;
    }

    function area()
    {
        return "圆形的面积是:".(3.14*$this->radius*$this->radius);
    }

    function perimeter()
    {
        return "圆形的周长是:".(2*3.14*$this->radius);
    }

//把子类矩形对象赋给形状的一个引用
$shape=new Rect(5, 10);

echo $shape->area()."
";
echo $shape->perimeter()."
";

//把子类圆形对象赋给形状的一个引用
$shape=new Circular(10);

echo $shape->area()."
";
echo $shape->perimeter()."
";

上例执行结果:
矩形的面积是:50
矩形的周长是:30
圆形的面积是:314
圆形的周长是:62.8

好了关于它们三个我们有详细的介绍了,大家不懂还可以百度一下哦。

$_POST 变量用于收集来自 method=\"post\" 的表单中的值。从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。

先来看个最简单的实例

 代码如下 复制代码

<form action ="post.php" method ="post">
Name: <input type="text" name="username" />
<input type ="submit" value="ok" />
</form>

如我输入 你好,

post.php文件代码如下

 代码如下 复制代码

You are <?php echo $_POST["username"]?>.

输出结果就是

You are 你好

那么post如何获取像单选按钮呢,实例如下

 代码如下 复制代码

<form action = "radiopost.php" method = "post">
<input type="radio" name="abcde" value = "Apple">Apple</input><br />
<input type="radio" name="abcde" value = "Orange">Orange</input><br />
<input type="radio" name="abcde" value = "Mango">Mango</input><br />
<input type="submit" value="ok">
</form>

radiopost.php文件

 代码如下 复制代码

<?php echo $_POST["abcde"]?>

这样你选择那个就全出输那个的值,对于checkbox会有所不同,这个大家可以注意一下

 代码如下 复制代码

<form action = "checkboxpost.php" method = "post">
<input type="checkbox" name="abcde[ ]" value = "Apple">Apple</input><br />
<input type="checkbox" name="abcde[ ]" value = "Orange">Orange</input><br />
<input type="checkbox" name="abcde[ ]" value = "Mango">Mango</input><br />
<input type="submit" value="ok">
</form>

checkboxpost.php文件

 代码如下 复制代码

print_r($_POST['abcde']);

输出的是个数组形式了

注:
通过 HTTP POST 发送的变量不会显示在 URL 中。
变量没有长度限制。

$_POST 与 php://input可以取到值,$HTTP_RAW_POST_DATA 为空
$_POST 以关联数组方式组织提交的数据,并对此进行编码处理,如urldecode,甚至编码转换。
php://input 可通过输入流以文件读取方式取得未经处理的POST原始数据

php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input 不能用于 enctype="multipart/form-data"。
这里拓展一下post模拟方法

 代码如下 复制代码

<?PHP           
    $flag = 0;       
    //要post的数据        
$argv = array(       
     'var1'=>'abc',        
     'var2'=>'你好吗');        
//构造要post的字符串        
foreach ($argv as $key=>$value) {        
     if ($flag!=0) {       
             $params .= "&";        
             $flag = 1;        
     }        
     $params.= $key."="; $params.= urlencode($value);        
     $flag = 1;        
     }        
     $length = strlen($params);       
         //创建socket连接        
     $fp = fsockopen("127.0.0.1",80,$errno,$errstr,10) or exit($errstr."--->".$errno);        
     //构造post请求的头        
     $header = "POST /mobile/try.php HTTP/1.1";        
     $header .= "Host:127.0.0.1";        
     $header .= "Referer:/mobile/sendpost.php";        
     $header .= "Content-Type: application/x-www-form-urlencoded";        
     $header .= "Content-Length: ".$length."";        
     $header .= "Connection: Close";       
     //添加post的字符串        
     $header .= $params."";        
     //发送post的数据        
     fputs($fp,$header);        
     $inheader = 1;        
     while (!feof($fp)) {       
             $line = fgets($fp,1024); //去除请求包的头只显示页面的返回数据        
             if ($inheader && ($line == "n" || $line == "")) {       
                 $inheader = 0;        
             }        
             if ($inheader == 0) {        
                 echo $line;        
             }        
     }        
fclose($fp);        
?>     

static 是定义一个静态对象或静态变量,关于static 定义的变量或类方法有什么特性我们看完本文章的相关实例后就见分晓了。

1. 创建对象$object = new Class(),然后使用”->”调用:$object->attribute/function,前提是该变量/方法可访问。
2. 直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以。但是有前提条件:
A. 如果是变量,需要该变量可访问。
B. 如果是方法,除了该方法可访问外,还需要满足:
b1) 如果是静态方法,没有特殊条件;
b2) 如果是非静态方法,需要改方法中没有使用$this,即没有调用非静态的变量/方法,当然,调用静态的变量/方法没有问题。

然后我们再看一下使用$object->… 和使用class::… 都有什么区别:
1. 使用$object->… ,需要执行构造函数创建对象;
2. 使用class::… 调用静态方法/变量,不需要执行构造函数创建对象;
3. 使用class::… 调用非静态方法/变量,也不需要执行构造函数创建对象。

然后奇怪的地方就出来了,既然2和3都一样,那静态方法/变量存在还有什么意义呢?
静态 static
声明类成员或方法为 static ,就可以不实例化类而直接访问,不能通过一个对象来访问其中的静态成员(静态方法除外)。静态成员属于类,不属于任何对象实例,但类的对象实例都能共享。

例子:

 代码如下 复制代码

<?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();    // 输出:我是中国人
?>

运行该例子,输出:

中国
我是中国人
我是中国人
中国
我是中国人
小结
在类内部访问静态成员属性或者方法,使用 self::(注意不是 $slef),如:

 代码如下 复制代码
slef:: $country
slef:: myCountry()

在子类访问父类静态成员属性或方法,使用 parent::(注意不是 $parent),如:

 代码如下 复制代码
parent:: $country
parent:: myCountry()

外部访问静态成员属性和方法为 类名/子类名:: ,如:

 代码如下 复制代码
Person::$country
Person::myCountry()
Student::$country

但静态方法也可以通过普通对象的方式访问。


例子 声明静态变量

 代码如下 复制代码

<?PHP
   function foo(){
   static $int = 0;// correct
   static $int = 1+2;   // wrong (as it is an expression)
   static $int = sqrt(121); // wrong (as it is an expression too)
  
   $int++;
   echo $int;
   }
   ?>

例子 使用静态变量的例子

 代码如下 复制代码
<?PHP
   function Test()
   {
   static $w3sky = 0;
   echo $w3sky;
   $w3sky++;
   }
   ?>

现在,每次调用 Test() 函数都会输出 $w3sky 的值并加一。


静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来中止递归。一下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止:

例子 静态变量与递归函数

 代码如下 复制代码

<?PHP
   function Test()
   {
   static $count = 0;
  
   $count++;
   echo $count;
   if ($count < 10) {
   Test();
   }
   $count--;
   }
   ?>

注: 静态变量可以按照上面的例子声明。如果在声明中用表达式的结果对其赋值会导致解析错误。

更多关于php静态变量用法

[!--infotagslink--]

相关文章

  • Php文件上传类class.upload.php用法示例

    本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • jQuery实现简单的文件上传进度条效果

    本文实例讲述了jQuery实现文件上传进度条效果的代码。分享给大家供大家参考。具体如下: 运行效果截图如下:具体代码如下:<!DOCTYPE html><html><head><meta charset="utf-8"><title>upload</title><link rel="stylesheet...2015-11-24
  • php文件上传你必须知道的几点

    本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
  • 借助FileReader实现将文件编码为Base64后通过AJAX上传

    这篇文章主要介绍了借助FileReader实现将文件编码为Base64后通过AJAX上传的方法,包括后端对文件数据解码并保存的PHP代码,需要的朋友可以参考下...2015-12-25
  • js实现上传文件添加和删除文件选择框

    这篇文章主要为大家详细介绍了js实现上传文件添加和删除文件选择框 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-25
  • jQuery+ajax简单实现文件上传的方法

    这篇文章主要介绍了jQuery+ajax简单实现文件上传的方法,结合实例形式简单分析了jQuery基于ajax的post方法进行文件传输及asp.net后台处理技巧,需要的朋友可以参考下...2016-06-12
  • ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单

    首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31
  • 适用于初学者的简易PHP文件上传类

    本文实例讲述了PHP多文件上传类,分享给大家供大家参考。具体如下:<&#63;phpclass Test_Upload{ protected $_uploaded = array(); protected $_destination; protected $_max = 1024000; protected $_messages =...2015-10-30
  • js 实现文件上传样式详情

    这篇文章主要介绍了js 实现文件上传样式,下面文章举例说明js 是如何实现文件上传样式的,附有代码详细解说,需要的朋友可以参考一下,希望对你有所帮助...2021-10-21
  • PHP利用APC模块实现大文件上传进度条的方法

    php 大文件带进度的上传,一直是一个令php程序员很苦恼的问题。查询baidu 、Google ,大体做带进度的上传方式为:flash+php,socket,apc+php等,下面我介绍了apc +php+ajax制作的带进度的上传,并贴出源码,希望对大家有用。 Altern...2015-10-30
  • C#文件上传的简单实现

    这篇文章主要为大家详细介绍了C#文件上传的简单实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • thinkPHP中多维数组的遍历方法

    这篇文章主要介绍了thinkPHP中多维数组的遍历方法,以简单实例形式分析了thinkPHP中foreach语句的使用技巧,需要的朋友可以参考下...2016-01-12
  • php需登录的文件上传管理系统

    本文给大家介绍一个不错的需要登录的php 文件上传管理系统,功能简单有需要了解的同学可参考。 代码如下<&#63;php$admin_pw="admin";//管理密码$uploaddir="upload";//上传目录session_start();if($_GET['action']=="g...2015-10-30
  • asp.net html控件的File控件实现多文件上传实例分享

    asp.net中html控件的File控件实现多文件上传简单实例,开发工具vs2010使用c#语言,感兴趣的朋友可以了解下,必定是多文件上传值得学习,或许本文所提供的知识点对你有所帮助...2021-09-22
  • TypeScript前端上传文件到MinIO示例详解

    这篇文章主要为大家介绍了TypeScript前端上传文件到MinIO示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...2022-10-12
  • JQuery异步提交表单与文件上传功能示例

    这篇文章主要介绍了JQuery异步提交表单与文件上传功能,结合实例形式分析了jQuery表单提交及文件传输操作的相关实现技巧,需要的朋友可以参考下...2017-01-16
  • thinkphp自定义权限管理之名称判断方法

    下面小编就为大家带来一篇thinkphp自定义权限管理之名称判断方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-04-03
  • PHP文件上传主要代码讲解

    复制代码 代码如下:<?php if($_FILES['myfile']['name'] != '') { if($_FILES['myfile']['error'] > 0) { echo "错误状态:" . $_FILES['myfile']['error']; } else { move_uploaded_f...2013-10-04
  • thinkphp怎么用?ThinkPHP使用方法

    本文详细介绍了ThinkPHP使用方法,不懂的同学快来跟小编一起看看吧 1、下载ThinkPHP模板,整个导入到项目根目录下。2、修改index.php文件,内容如下:<?php/***临时配置,...2017-07-06