在php中self与$this的分别

作者&投稿:乐彩 (若有异议请与网页底部的电邮联系)
php this和self的区别~

面向对象编程(OOP,Object Oriented Programming)现已经成为编程人员的一项基本技能。利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划web开发构架都是很有意义的。
PHP5 经过重写后,对OOP的支持额有了很大的飞跃,成为了具备了大部分面向对象语言的特性的语言,比PHP4有了很多的面向对象的特性。这里我主要谈的是 this,self,parent 三个关键字之间的区别。从字面上来理解,分别是指 这、自己、父亲。先初步解释一下,this是指向当前对象的指针(可以看成C里面的指针),self是指向当前类的指针,parent是指向父类的指针。 我们这里频繁使用指针来描述,是因为没有更好的语言来表达。关于指针的概念,大家可以去参考百科。
下面我们就根据实际的例子结合来讲讲。
class name //建立了一个名为name的类
{
private $name; //定义属性,私有

//定义构造函数,用于初始化赋值
function __construct( $name )
{
$this->name = $name; //这里已经使用了this指针语句①
}

//析构函数
function __destruct(){}

//打印用户名成员函数
function printname()
{
print( $this->name ); //再次使用了this指针语句②,也可以使用echo输出
}
}
$obj1 = new name( "PBPHome" ); //实例化对象 语句③

//执行打印
$obj1->printname(); //输出: PBPHome
echo "
"; //输出:回车

//第二次实例化对象
$obj2 = new name( "PHP" );

//执行打印
$obj2->printname(); //输出:PHP
?>


说 明:上面的类分别在 语句①和语句②使用了this指针,那么当时this是指向谁呢?其实this是在实例化的时候来确定指向谁,比如第一次实例化对象的时候(语句③),那 么当时this就是指向$obj1对象,那么执行语句②的打印时就把 print( $this->name ),那么当然就输出了"PBPHome"。第二个实例的时候,print( $this->name )变成了print( $obj2->name ),于是就输出了"PHP"。所以说,this就是指向当前对象实例的指针,不指向任何其他对象或类。

{二}。PHP中this,self,parent的区别之二self篇

此篇我们就self的用法进行讲解

首 先我们要明确一点,self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。假如我们使用类里面静态 (一般用关键字static)的成员,我们也必须使用self来调用。还要注意使用self来调用静态变量必须使用 :: (域运算符号),见实例。


class counter //定义一个counter的类
{
//定义属性,包括一个静态变量$firstCount,并赋初值0 语句①
private static $firstCount = 0;
private $lastCount;

//构造函数
function __construct()
{
$this->lastCount = ++self::$firstCount; //使用self来调用静态变量 语句②
}

//打印lastCount数值
function printLastCount()
{
print( $this->lastCount );
}
}

//实例化对象
$obj = new Counter();

$obj->printLastCount(); //执行到这里的时候,程序输出 1

?>

这 里要注意两个地方语句①和语句②。我们在语句①定义了一个静态变量$firstCount,那么在语句②的时候使用了self调用这个值,那么这时候我们 调用的就是类自己定义的静态变量$frestCount。我们的静态变量与下面对象的实例无关,它只是跟类有关,那么我调用类本身的的,那么我们就无法使 用this来引用,因为self是指向类本身,与任何对象实例无关。然后前面使用的this调用的是实例化的对象$obj,大家不要混淆了。

关于self就说到这里,结合例子还是比较方便理解的。第二篇结束。



{三}PHP中this,self,parent的区别之三parent篇

此篇我们就parent的用法进行讲解。

首先,我们明确,parent是指向父类的指针,一般我们使用parent来调用父类的构造函数。实例如下:

//建立基类Animal
class Animal
{
public $name; //基类的属性,名字$name

//基类的构造函数,初始化赋值
public function __construct( $name )
{
$this->name = $name;
}
}

//定义派生类Person 继承自Animal类
class Person extends Animal
{
public $personSex; //对于派生类,新定义了属性$personSex性别、$personAge年龄
public $personAge;

//派生类的构造函数
function __construct( $personSex, $personAge )
{
parent::__construct( "PBPHome" ); //使用parent调用了父类的构造函数 语句①
$this->personSex = $personSex;
$this->personAge = $personAge;
}

//派生类的成员函数,用于打印,格式:名字 is name,age is 年龄
function printPerson()
{
print( $this->name. " is " .$this->personSex. ",age is " .$this->personAge );
}
}

//实例化Person对象
$personObject = new Person( "male", "21");

//执行打印
$personObject->printPerson(); //输出结果:PBPHome is male,age is 21

?>

里 面同样含有this的用法,大家自己分析。我们注意这么个细节:成员属性都是public(公有属性和方法,类内部和外部的代码均可访问)的,特别是父类 的,这是为了供继承类通过this来访问。关键点在语句①: parent::__construct( "heiyeluren" ),这时候我们就使用parent来调用父类的构造函数进行对父类的初始化,这样,继承类的对象就都给赋值了name为PBPHome。我们可以测试下, 再实例化一个对象$personObject1,执行打印后name仍然是PBPHome。

总结:this是指向对象实例的一个指针,在实例化的时候来确定指向;self是对类本身的一个引用,一般用来指向类中的静态变量;parent是对父类的引用,一般使用parent来调用父类的构造函数。

PHP支持类和面向对象结构,PHP的类的静态函数和变量不与任何特定类的实例相关联(换句话说,一个对象)。
相反,静态函数和变量与类定义本身相关联。换言之,一个类的所有实例都共享相同的静态变量。在一个类的方法(函数)的上下文中,静态变量和函数被访问使用self::,在一个类的对象(实例)的上下文中使用其他方法和变量时用this。
静态函数只能使用静态变量,静态函数和变量的引用是通过 self::函数名() 和 self::变量名。上述实例中,静态变量的引用是由类名(exampleClass::$foo),或者 self:: (self::$foo),当在这个类的静态方法[称为 静态函数()]里使用时。类的正则函数和变量需要一个对象上下文来引用,他们不能脱离对象上下文而存在。对象上下文由 $this 提供。在上述函数中,$bar 是一个正则变量,所以它被 $obj->bar(上下文使用变量obj) 来引用,或者使用 $this->bar(再次在一个对象的方法里在一个对象上下文中) 来引用。
self 不使用前面的 $,因为 self 不意味着是一个变量而是类结构本身。而 $this 引用一个特定的变量,所以有前面的 $ 。

1、意思上的区别

self代表类,$this代表对象(self是引用静态类的类名,而$this是引用非静态类的实例名)

2、用法上的区别

能用$this的地方一定使用self,能用self的地方不一定能用$this。

扩展资料:

Python中self用法详解

1、以Student类为例,在Python中,定义类如下:

class Student(object):

pass

(Object)表示该类从哪个类继承下来的,Object类是所有类都会继承的类。

2、实例:定义好了类,就可以通过Student类创建出Student的实例,创建实例是通过类名+()实现:

student = Student()

3、由于类起到模板的作用,因此,可以在创建实例的时候,把我们认为必须绑定的属性强制填写进去。这里就用到Python当中的一个内置方法__init__方法,例如在Student类时,把name、score等属性绑上去:

class Student(object):

def __init__(self, name, score):

self.name = name

self.score = score



默认public下,静态变量只有使用::方式才可以访问 ,非静态变量::方式不能访问,静态或者非静态的方法都可以被->或::方式访问。

一句话,self是引用静态类的类名,而$this是引用非静态类的实例名。

self在对象中自己调用自己使用
$this在实例化后使用$this方法

$this,self,parent三个关键字从字面上比较好理解,分别是指这、自己、父亲。
$this 是指向当前对象的指针,$this表示当前所在类对象这个很不明确,$this取决于自己所在方法被调用时的执行环境,当前方法在哪个对象环境下执行,该方法的$this就表示该对象,针对还原一层层到最初始的方法的对象,说得更通俗一点,$this是指向当前对象的指针。
self 是指向当前类的指针;self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。假如我们使用类里面静态(一般用关键字static)的成员,我们也必须使用self来调用。还要注意使用self来调用静态变量必须使用:: (域运算符号)
parent是指向父类的指针。parent是指向父类的指针,一般我们使用parent来调用父类的构造函数。
相关实例请参考:https://panxu.net/article/8366.html


PHP self为什么可以访问非静态方法?
要明确self 与 this的区别,不要把self与this混淆,这一点很重要:this 的含义是 “当前对象” 或是 “类的当前实例”,而 self 表示 “当前类” 或 “当前对象所属的类”。

php里?前面是个什么表达式 “self::”是什么意思 self::getResult{$...
条件 ? 结果1 : 结果2 里面的?号是格式要求。也可以理解为是不是条件成立,条件成立为结果1否则为结果2。 这叫三目运算 大多数语言都支持 self::getResult{$ret} 就是在类里面调用自己的getResult() 方法

php问题。下面代码中的“self::$obj = new self(); ”是什么意思?_百 ...
就是返回它自己实例化的对象。就有点相当于$db = DB::getInstance();可以写成$db = new DB();

PHP的$PHP_SELF使用问题
这是php的几个系统的变量 比如你的a.php文件在 \/www\/g\/f\/ 那么如果你只是 echo $PHP_SELF 那么就会得到 \/www\/g\/f\/a.php 另外php这样系统函数还有不少 比如 $REMOTE_ADDR 表示获取客户端的ip 这些东西在 phpinfo()中都可以看到 注意这里这些字母都是大写的 你说的下面那个问题是由于那个offset...

php怎么理解这些个关键字啊,public;private;protect;final;static;const...
在子类中可以通过self::var 或self::method调用, 可以通过parent::method来调用父类中的方法 在实例中不能通过$obj->var 来调用 protected类型的方法或属性 private: 私有类型 该类型的属性或方法只能在该类中使用,在该类的实例、子类中、子类的实例中都不能调用私有类型的属性和方法 再来说说final...

php 相关有谁见过这样的写法的 ?是什么意思啊?self::${$localOptionMemb...
这是可变变量的写法。你的情况 localOptionMemberName = “XX”;self::${$localOptionMemberName} 就相当于self::$XX;把大括号中的变量转化成字符串,然后作为变量名。简单的例子:a = 1;b = 'a';c = ${$b};echo $c;\/\/ 结果应该是1;...

关于PHP的$PHP_SELF的问题
有时候$PHP_SELF确实没有定义,这个与INI设置有关,用下面的语句肯定能解决问题:<?php echo <<<END END;?>

PHP里$_SERVER['HTTP_HOST']和$_SERVER['PHP_SELF']区别
两者的区别在于含义不同:假如命令行的地址是:xxx 那么:$_SERVER['HTTP_HOST']=='www.baidu.com'$_SERVER['PHP_SELF']=='\/index.php'所以前者是主机地址,后者是脚本文件的绝对路径。

php this,self 静态对象,成员的访问
A: 通常动态对象中可以访问静态成员。只是不推荐但不禁止$this->静态成员。主要用"类名::静态成员"这种形式 问题标注里写出了,$this-req的req是哪里的对象呢?A: 好像这些代码已经混乱了$this->req明显是下面Request类才有的成员 ,private static和static private意义相同吗?A:相同无区别 ...

php中 & || ^ 的符号意思。
从“假”变成“真(非假)”的结果。特性 PHP的特性包括:PHP 独特的语法混合了 C、Java、Perl 以及 PHP [8]自创新的语法。PHP安装它可以比 CGI或者Perl更快速的执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成htmL标记的CGI要高许多...

邯郸市13844589527: 在php中self与$this的分别 -
勇何朗清: 在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者static,那么就必须使用操作符->.另外,如果从类的内部访问const或者static变量或者方法,那么就必须使用自引用的self,反之如果从类的内部访问不为const或者static变量或者方法,那么就必须使用自引用的$this.结论 : self与$this的功能极其相似,但二者又不相同.$this不能引用静态成员和常量.self更像类本事,而$this更像是实例本身.

邯郸市13844589527: 在php中self与$this的分别
勇何朗清: 一句话,self是引用静态类的类名,而$this是引用非静态类的实例名.

邯郸市13844589527: php this和self的区别 -
勇何朗清: 面向对象编程(OOP,Object Oriented Programming)现已经成为编程人员的一项基本技能.利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划web开发构架都是很有意义的. PHP5 经过重写后,对OOP的支持额有了很大的飞...

邯郸市13844589527: php self -
勇何朗清: PHP中::、->、self、$this操作符的区别在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者static,那么就必须使用操作符->.另外,如果从类的内部访问const或者static变量或者方法,那么就必须使用自引用的self,反之如果从类的内部访问不为const或者static变量或者方法,那么就必须使用自引用的$this.

邯郸市13844589527: php关于self与this -
勇何朗清: 原则上self是静态调用 this是非静态调用 但是php默认这两种方法其实都可以调用 这是php的一个小问题 它在这个调用规则上并不严格 而是交给程序员去处理了 但是如果你要用this去调用静态内容就不行了应该

邯郸市13844589527: php 类中的用$this或self::引用类中的一个方法(静态或非静态)时都可以,有没有特别要求说必须用什么. -
勇何朗清: 运行效率与这两个操作符没有关系.调用当前类的静态方法,规范的写法是使用 self 而非 $this.因为当你的PHP版本小于 5.3.0,使用 $this 会让代码出现解析错误,而无法运行.自 PHP 5.3.0 起,才可以通过变量来引用类.PHP中所有以 $ 开...

邯郸市13844589527: PHP中this,self和static的区别 -
勇何朗清: 1. PHP支持类和面向对象结构,PHP的类的静态函数和变量不与任何特定类的实例相关联(换句话说,一个对象).2. 相反,静态函数和变量与类定义本身相关联.换言之,一个类的所有实例都共享相同的静态变量.在一个类的方法(函数)...

邯郸市13844589527: php里面$this - > = 用法和意思 -
勇何朗清: 第一行:$this->srvMobile 表示该函数所属类中$srvMobile成员变量,所以这行代码表示将等号左面的值赋给该类$srvMobile成员变量. 补充:由于等号右面使用&符号,所以这两个变量是共用一个地址,当修改$this->srvMobile的时候...

邯郸市13844589527: php里“ :: ”是怎么用的 - 技术
勇何朗清: self 和$this 相似,只不过self 是代表这个静态方法所在的类.所以在静态方法里,可以使用这个方法所在的类的“类名”,也可以使用“self”来访问其它静态成员,如果没有特殊情况的话,我们通常使用后者,即“self::成员属性”的方式.还有parent:: 是调用 父类的属性或函数.区别google找找吧..[]

邯郸市13844589527: 请教下在学习 php中的一些问题 .
勇何朗清: 在类里面的时候,$this->func()和self::func()没什么区别.例如:class myClass{ function aaa(){ echo 'hello'; } function bbb(){ //在这里调用aaa()方法,既可以使用$this->aaa(); 也可以使用 self::aaa(); }} 在外部的时候,->必须是...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网