8
回答
php 或者 typecho 中对象属性或者方法丢失

先说环境,本地WIN7 64 + Nginx 1.7 + php5.4 + mysql 5.5

运行Typecho,准备做一个主题。

typecho 的大部分组件都是通过 $this 引用的。

index 文件如下, 请请教各位,为什么到函数里面 options 对象会是 NULL ?

var_dump($this);    # 正常
var_dump($this->options); # 正常

function foo ($inst)
{
    var_dump($inst);    # 正常
    var_dump($inst->options);  # 这里是 NULL, why ?
}

foo($this);




举报
yansen_zh
发帖于3年前 8回/220阅
共有8个答案 最后回答: 3年前
 $this 的含义是表示    实例化后的 具体对象!
我们一般是先声明一个类,然后用这个类去实例化对象!
但是,当我们在声明这个类的时候,想在类本身内部使用本类的属性或者方法。应该怎么表示呢?
例如:

我声明一个User类!它只含有一个属性 $name;

class User
{
   public $_name;
}

现在,我给User类加个方法。就用getName()方法,输出$name属性的值吧! 复制PHP内容到剪贴板

class User
{
      public $name;

      function getName()
      {
             echo $this->name;
      }
}

//如何使用呢?

$user1 = new User();
$user1->name = '张三';
$user1->getName();        //这里就会输出张三!
$user2 = new User();
$user2->name = '李四';   
$user2->getName();       //这里会输出李四!

怎么理解呢?

我上面创建了两个User对象。分别是 $user1 和   $user2 。

当我调用 $user1->getName()的时候。   
上面User类中的代码 echo $this->name ; 就是相当于是   echo $user1->name;

大概就是这么个意思!

其实,你也不要去钻牛角尖。你只要知道那是一个用来表示类内部的属性和方法的代号就好了!越想越糊涂的!
PHP5中为解决变量的命名冲突和不确定性问题,引入关键字“$this”代表其所在当前对象。
$this在构造函数中指该构造函数所创建的新对象。
在类中使用当前对象的属性和方法,必须使用$this->取值。
方法内的局部变量,不属于对象,不使用$this关键字取值。
局部变量和全局变量与 $this 关键字

使用当前对象的属性必须使用$this关键字。

局部变量的只在当前对象的方法内有效,所以直接使用。

注意:局部变量和属性可以同名,但用法不一样。在使用中,要尽量避免这样使用,以免混淆。
01    <!-- 验证属性和局部变量使用方法的类 -->
02    <?
03    class A{
04        private $a = 99;
05        //这里写一个打印参数的方法.
06        public function printInt($a){
07            echo "这里的 \$a 是传递的参数 $a ";
08            echo "<br>";
09            echo "这里的 \$this->a 是属性 $this->a";
10        }
11    }
12    $a = new A(); // 这里的$a 可不是类中的任何一个变量了.
13    $a->printInt(88);
14    ?>

程序运行结果:
1    这里的 $a 是传递的参数 88
2    这里的 $this->a 是属性 99
用$this调用对象中的其它方法
01    <!--写一个类,让他自动完成最大值的换算.-->
02    <?
03    class Math{
04        //两个数值比较大小.
05        public function Max($a,$b){
06            return $a>$b?$a:$b;     
07        }
08        //三个数值比较大小.
09        public function Max3($a,$b,$c){
10            //调用类中的其它方法.
11            $a = $this->Max($a,$b);
12            return $this->Max($a,$c);       
13        }
14    }
15    $math = new Math();
16    echo "最大值是 ".$math->Max3(99,100,88);
17    ?>

程序运行结果:
    最大值是 100
使用$this调用构造函数

调用构造函数和析构函数的方法一致。
<?
class A{
    private $a = 0;
    public function __construct(){
        $this->a = $this->a + 1 ;
    }
    
    public function doSomeThing(){
        $this->__construct();
        return $this->a;
    }
    
    
}
$a = new A(); // 这里的$a 可不是类中的任何一个变量了.
echo "现在 \$a 的值是" . $a->doSomeThing();
?>


程序运行结果:
1    现在 $a 的值是2
$this 到底指的什么?

$this 就是指当前对象,我们甚至可以返回这个对象使用 $this
<?
class A{
    public function  getASelf(){
        return $this;
    }
    public function __toString(){
        return "这是类A的实例.";        
    }    
}
$a = new A(); // 创建A的实例;
$b = $a->getASelf(); //调用方法返回当前实例.
echo $a; //打印对象会调用它的__toString方法.
?>

程序运行结果:
1    这是类A的实例.
通过 $this 传递对象
<!-- 通过$this 传递对象
在这个例子中,我们写一个根据不同的年龄发不同工资的类.
我们设置处理年龄和工资的业务模型为一个独立的类.
-->
<?
class User{
    private $age ;
    private $sal ;
    private $payoff ; //声明全局属性.
    
    //构造函数,中创建Payoff的对象.
    public function __construct(){
        $this->payoff = new Payoff();
    }    
    public function getAge(){
        return $this->age;
    }
    public function setAge($age){
        $this->age = $age;
    }    
    // 获得工资.
    public     function getSal(){
        $this->sal =  $this->payoff->figure($this);
        return $this->sal;
    }
}
//这是对应工资与年龄关系的类.
class Payoff{
    public function figure($a){
        $sal =0;
        $age = $a->getAge();
        if($age >80 || $age <16 ){
            $sal = 0;
        }elseif ($age > 50){
            $sal = 1000;
        }else{
            $sal = 800;
        }
        return $sal;
    }
}
//实例化User
$user = new User();

$user->setAge(55);
echo $user->getAge()."age ,his sal is " . $user->getSal();
echo "<br>";

$user->setAge(20);
echo $user->getAge()."age , his sal is " . $user->getSal();
echo "<br>";

$user->setAge(-20);
echo $user->getAge()."age , his sal is " . $user->getSal();
echo "<br>";

$user->setAge(150);
echo $user->getAge()."age , his sal is " . $user->getSal();
?>


程序运行结果:
    55age ,his sal is 1000
    20age , his sal is 800
    -20age , his sal is 0
    150age , his sal is 0.

引用来自“HenNi”的评论

你自己凭空生个inst类出来的?class inst没有被定义当然会错。
什么意思? 没理解你说的。按照你的说法,class inst 没有定义,为什么 var_dump($inst) 会成功?再者, $inst 应该是 $this 对象的引用啊。难道这么理解不对?

引用来自“mickelfeng”的评论

 $this 的含义是表示    实例化后的 具体对象!
我们一般是先声明一个类,然后用这个类去实例化对象!
但是,当我们在声明这个类的时候,想在类本身内部使用本类的属性或者方法。应该怎么表示呢?
例如:

我声明一个User类!它只含有一个属性 $name;

class User
{
   public $_name;
}

现在,我给User类加个方法。就用getName()方法,输出$name属性的值吧! 复制PHP内容到剪贴板

class User
{
      public $name;

      function getName()
      {
             echo $this->name;
      }
}

//如何使用呢?

$user1 = new User();
$user1->name = '张三';
$user1->getName();        //这里就会输出张三!
$user2 = new User();
$user2->name = '李四';   
$user2->getName();       //这里会输出李四!

怎么理解呢?

我上面创建了两个User对象。分别是 $user1 和   $user2 。

当我调用 $user1->getName()的时候。   
上面User类中的代码 echo $this->name ; 就是相当于是   echo $user1->name;

大概就是这么个意思!

其实,你也不要去钻牛角尖。你只要知道那是一个用来表示类内部的属性和方法的代号就好了!越想越糊涂的!
能直接一点吗,你说的这些,和我的问题有什么直接的关系吗?或者说你想表达的是什么? 我想知道,为什么 var_dump($inst) 可以,但是 var_dump($inst->options) 就不行?

引用来自“mickelfeng”的评论

PHP5中为解决变量的命名冲突和不确定性问题,引入关键字“$this”代表其所在当前对象。
$this在构造函数中指该构造函数所创建的新对象。
在类中使用当前对象的属性和方法,必须使用$this->取值。
方法内的局部变量,不属于对象,不使用$this关键字取值。
局部变量和全局变量与 $this 关键字

使用当前对象的属性必须使用$this关键字。

局部变量的只在当前对象的方法内有效,所以直接使用。

注意:局部变量和属性可以同名,但用法不一样。在使用中,要尽量避免这样使用,以免混淆。
01    <!-- 验证属性和局部变量使用方法的类 -->
02    <?
03    class A{
04        private $a = 99;
05        //这里写一个打印参数的方法.
06        public function printInt($a){
07            echo "这里的 \$a 是传递的参数 $a ";
08            echo "<br>";
09            echo "这里的 \$this->a 是属性 $this->a";
10        }
11    }
12    $a = new A(); // 这里的$a 可不是类中的任何一个变量了.
13    $a->printInt(88);
14    ?>

程序运行结果:
1    这里的 $a 是传递的参数 88
2    这里的 $this->a 是属性 99
用$this调用对象中的其它方法
01    <!--写一个类,让他自动完成最大值的换算.-->
02    <?
03    class Math{
04        //两个数值比较大小.
05        public function Max($a,$b){
06            return $a>$b?$a:$b;     
07        }
08        //三个数值比较大小.
09        public function Max3($a,$b,$c){
10            //调用类中的其它方法.
11            $a = $this->Max($a,$b);
12            return $this->Max($a,$c);       
13        }
14    }
15    $math = new Math();
16    echo "最大值是 ".$math->Max3(99,100,88);
17    ?>

程序运行结果:
    最大值是 100
使用$this调用构造函数

调用构造函数和析构函数的方法一致。
<?
class A{
    private $a = 0;
    public function __construct(){
        $this->a = $this->a + 1 ;
    }
    
    public function doSomeThing(){
        $this->__construct();
        return $this->a;
    }
    
    
}
$a = new A(); // 这里的$a 可不是类中的任何一个变量了.
echo "现在 \$a 的值是" . $a->doSomeThing();
?>


程序运行结果:
1    现在 $a 的值是2
$this 到底指的什么?

$this 就是指当前对象,我们甚至可以返回这个对象使用 $this
<?
class A{
    public function  getASelf(){
        return $this;
    }
    public function __toString(){
        return "这是类A的实例.";        
    }    
}
$a = new A(); // 创建A的实例;
$b = $a->getASelf(); //调用方法返回当前实例.
echo $a; //打印对象会调用它的__toString方法.
?>

程序运行结果:
1    这是类A的实例.
通过 $this 传递对象
<!-- 通过$this 传递对象
在这个例子中,我们写一个根据不同的年龄发不同工资的类.
我们设置处理年龄和工资的业务模型为一个独立的类.
-->
<?
class User{
    private $age ;
    private $sal ;
    private $payoff ; //声明全局属性.
    
    //构造函数,中创建Payoff的对象.
    public function __construct(){
        $this->payoff = new Payoff();
    }    
    public function getAge(){
        return $this->age;
    }
    public function setAge($age){
        $this->age = $age;
    }    
    // 获得工资.
    public     function getSal(){
        $this->sal =  $this->payoff->figure($this);
        return $this->sal;
    }
}
//这是对应工资与年龄关系的类.
class Payoff{
    public function figure($a){
        $sal =0;
        $age = $a->getAge();
        if($age >80 || $age <16 ){
            $sal = 0;
        }elseif ($age > 50){
            $sal = 1000;
        }else{
            $sal = 800;
        }
        return $sal;
    }
}
//实例化User
$user = new User();

$user->setAge(55);
echo $user->getAge()."age ,his sal is " . $user->getSal();
echo "<br>";

$user->setAge(20);
echo $user->getAge()."age , his sal is " . $user->getSal();
echo "<br>";

$user->setAge(-20);
echo $user->getAge()."age , his sal is " . $user->getSal();
echo "<br>";

$user->setAge(150);
echo $user->getAge()."age , his sal is " . $user->getSal();
?>


程序运行结果:
    55age ,his sal is 1000
    20age , his sal is 800
    -20age , his sal is 0
    150age , his sal is 0.
你说的这些,和我的问题有什么直接的关系吗? 我想知道,为什么 var_dump($inst) 可以,但是 var_dump($inst->options) 就不行?
顶部