php-unset()方法是什么,怎么用的?

PHP / 1171人浏览 / 0人评论

要解释__unset()函数,首先看php:unset(),官方文档中解释了unset()(语言构造器而不是一个函数,不能被可变函数调用),unset()的作用是删除指定的变量且传回true,参数为要删除的变量,传入一个变量作为参数,如果传入的变量存在则返回true,否则返回false。官方解释:unset:释放给定的变量。

PHP5中的特殊方法

在php中内置了一些特书的方法,这些特殊方法被称之为魔术方法,其也有特殊的命名规则,以“__”双下划线开头的方法和函数名,所以我们自定义的函数不应该用双下划下开头,目的是为了区分魔术方法。

PHP魔术方法有哪些呢?

__construct()__autoload()__destruct()__call()__callStatic()__get()
__set()__isset()__unset()__sleep()__wakeup()__toString()__invoke()__set_state()__clone()__debugInfo() 等方法在 PHP 中被称为魔术方法(Magic methods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。

php unset(),__unset()函数

要解释__unset()函数,首先看php:unset(),官方文档中解释了unset()(语言构造器而不是一个函数,不能被可变函数调用),unset()的作用是删除指定的变量且传回true,参数为要删除的变量,传入一个变量作为参数,如果传入的变量存在则返回true,否则返回false。官方解释:unset:释放给定的变量。
支持版本:
(PHP 4, PHP 5, PHP 7)
unset()定义以及用法:
unset释放给定的变量。
unset()销毁指定的变量。
unset()在函数中的行为会依赖于想要销毁的变量的类型而有所不同。
如果在函数中unset()一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用unset()之前一样的值。
unset()语法:

unset ( mixed $var [, mixed $... ] ) : void

参数解释:

参数描述
要销毁的变量其他变量……多个变量用“,”分割

返回值:
void(没有返回值)
php unset()演示示例

<?php
function destroy_foo() {
    global $foo;
    unset($foo);
}
$foo = 'bar';
destroy_foo();
echo $foo;
?>

以上示例会输出:

bar

如果您想在函数中unset()一个全局变量,可使用$GLOBALS(引用全局作用域中可用的全部变量:一个包含了全部变量的全局组合数组,变量的名字就是数组的键)数组来实现。

<?php
function foo() 
{
    unset($GLOBALS['bar']);
}
$bar = "something";
foo();
?>

如果在函数中 unset() 一个通过引用传递的变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。

<?php
function foo(&$bar) {
    unset($bar);//销毁局部变量
    var_dump($bar);//打印局部变量
    echo "<br>";
    $bar = "blah";//重新赋值局部变量
    var_dump($bar);//在打印局部变量
}
$bar = 'something';
echo "$bar\n";
echo "<br>";
foo($bar);
echo "<br>";
echo "$bar\n";
?>

以上示例会输出:

something
NULL
string(4) "blah"
something

如果在函数中 unset() 一个静态变量,那么在函数内部此静态变量将被销毁。但是,当再次调用此函数时,此静态变量将被复原为上次被销毁之前的值。

<?php
function foo()
{
    static $bar;
    $bar++;
    echo "在销毁之前: $bar, ";
    unset($bar);
    $bar = 23;
    echo "在销毁之后: $bar\n";
}
foo();//第一次调用foo()
foo();//第二次调用foo()
foo();//第三次调用foo()
?>

在上例代码中,foo()函数被调用三次,而函数中定义了静态变量$bar(如果不是静态变量,会出现什么情况?请测试),$bar未初始化,值为NULL,$bar++($bar = $bar + 1),所以第一次调用foo(),$bar++之后函数内部静态变量$bar的值为1,所以在第一次函数内销毁$bar之前$bar值为1,销毁之后如果在下面打印函数内静态变量$bar,返回的是NULL,后面的代码就是给函数内变量$bar重新赋值23,所以此时函数内静态变量$bar的值为23。上面提到,当我们第二次调用foo()函数的时候,函数内静态变量$bar的值就是上一次执行被销毁前的值。也就是第二次调用,$bar的值不是NULL,而是1,所以就出现了下面的输出。
以上示例会输出:

在销毁之前: 1, 在销毁之后: 23
在销毁之前: 2, 在销毁之后: 23
在销毁之前: 3, 在销毁之后: 23
<?php
// 销毁单个变量
unset ($foo);

// 销毁单个数组元素
unset ($bar['quux']);

// 销毁一个以上的变量
unset($foo1, $foo2, $foo3);
?>

(unset) 类型强制转换常常和函数 unset() 引起困惑。 为了完整性,(unset) 是作为一个 NULL 类型的强制转换。它不会改变变量的类型。

<?php
$name = 'Felipe';
var_dump((unset) $name);
var_dump($name);
?>

以上例程会输出:

NULL
string(6) "Felipe"

更多注释
Note:因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。
Note:在 PHP 5 之前无法在对象里销毁 $this。
Note:在 unset() 一个无法访问的对象属性时,如果定义了 __unset() 则会调用这个重载方法。

php__unset()函数

在学习php__unset()函数前,需知道属性重载:当访问一个不存在或者权限不够的属性的时候,能够触发一系列的魔术方法,就叫做属性重载__unset():当删除一个不存在或者权限不够的属性的时候会自动触发。

<?php

    class Person{

        public $name;
        private $age;

        public function __construct($name,$age) {
            $this->name = $name;
            $this->age  = $age;
        }

        public function __unset($name){
            $allow = array('age');

            if(in_array($name,$allow)){
                unset($this->$name);
            }
        }
    }
    echo '<pre>';
    $person = new Person('小明',22);

    var_dump($person);

    //unset($person->name);//公有属性可以直接被unset掉
    //var_dump($person);
    //unset私有属性

    unset($person->age);

    var_dump($person);

    unset($person->tail);

转载注明:

0 条评论

还没有人发表评论

发表评论 取消回复

记住我的信息,方便下次评论
有人回复时邮件通知我