有或没有$ this在PHP中

时间:2018-12-11 14:23:34

标签: php oop this

我是OOP PHP的新手。当代码也无法使用时,为什么还要使用$this引用?

如果我从此代码片段中同时删除两个$this(在-> sql之前),则修改也可以进行。尽管我读过它,但是我仍然不明白给定方法中的$this是什么。

class blogs{

    private $servername = "localhost";
    private $username = "root";
    private $password = "";
    private $dbname = "asd";
    private $conn = "";
    private $result = "";
    private $row = "";
    private $sql = "";

    public function cmd_update(){
        $this->sql = "UPDATE 
                blogs 
                SET
                `name` = '".$_GET['input_name']."',
                `date` = '".date('Y-m-d H:m:s')."',
                WHERE
                id = ".$_GET['input_modifying_id']."        
        ";

        if ($this->conn->query($this->sql) === TRUE) {
            echo "Successfully modified!";
        } else {
            echo "Modifying Unsuccessful!";
        }       
    }

2 个答案:

答案 0 :(得分:4)

$this指的是当前对象-在这种情况下,$thisblogs类的缩写。

让我们看这个示例类:

class Foo
{
    protected $a;

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

    public function getA()
    {
        return $this->a;
    }
}

在这里,我只是将$ a分配给传递给新Foo实例的任何内容,并创建一个公共可访问的函数以返回$ a。

我们使用$ this来表示我们当前所在的位置,$this->aprotected $a

对于开发人员来说,这是一个非常方便的功能,因为它意味着我们不必创建自己的无需重新声明即可获取实例的方式。这也意味着我们可以使用模板以便于使用。例如

class Foo
{
    public function sayHi()
    {
        return 'hello world';
    }
}

class Bar extends Foo
{}

因为公共函数很好。.公共我们可以使用$ this访问父类:

<?php
    $bar = new Bar();
    echo $bar->sayHi(); # will output hello world

这还意味着我们可以创建与该对象相关的一组通用函数和属性,以允许更多的动态代码。以这些博客为例:

title = hello world
content = hello world
img = /path/to/img.jpg

title = what we did last summer
content = played in the park
img = /path/to/another/img.jpg

我们可以有一个这样的博客课程:

class GenericController
{
    # pretend we've done some PDO set up here where we set new PDO to $this->pdo
    public function load($id)
    {
        $sql = 'SELECT * FROM `blogs` WHERE `id` = :id';
        $res = $this->pdo->prepare($sql);
        $res->execute(array(':id' => $id));

        return (object) $res->fetch(PDO::FETCH_ASSOC);
    }
}

class Blog extends GenericController
{
    protected $id;
    protected $data;

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

    protected function loadData()
    {
        $this->data = $this->load($this->id);
    }

    public function getTitle()
    {
        return $this->data->title;
    }

    public function getContent()
    {
        return $this->data->content;
    }

    public function getImg()
    {
        return $this->data->img
    }
}

$blogOne = new Blog(1);
$blogTwo = new Blog(2);

echo $blogOne->getTitle(); # will output hello world
echo $blogTwo->getTitle(); # will output what we did last summer

进一步阅读:

出于MySQL注入的原因(您的代码目前已开放所述注入):

PDO
PDO Prepared Statements

对于OOP:

The Basics
Visibility

和文档本身中的$this(可通过“基础知识”链接找到):

  

当从对象上下文中调用方法时,伪变量$ this可用。 $ this是对调用对象的引用(通常是该方法所属的对象,但如果从辅助对象的上下文中静态调用该方法,则可能是另一个对象)。从PHP 7.0.0开始,从不兼容的上下文中静态调用非静态方法会导致$ this在方法内部未定义

答案 1 :(得分:0)

$this是当前调用对象的引用,或者我们可以说该对象正在使用中。当您使用类的多个实例时,您的代码库将可用于不同的实例。此外,可见性还可以使您想要保持私有或公开状态。一旦设置,$this就可以在整个对象生命周期内正常工作,您可以接受对象/类范围内不限于该功能的任何地方。