关于对象访问静态方法、属性等问题

为何有这样的问题呢?源自一段代码,如下:

 1 class A
 2 {
 3     // public static $name = ‘wangyumeidsb‘;
 4
 5     public $name = ‘woaini‘;
 6
 7     public static function foo()
 8     {
 9         echo __CLASS__;
10     }
11
12     public function test()
13     {
14         self::foo();
15         echo ‘---‘;
16         $this->foo();
17         echo ‘<hr>‘;
18         // echo ‘this is A<br>‘."\n";
19     }
20
21     public function say()
22     {
23         echo ‘我是非静态方法‘;
24     }
25 }
26
27 class B extends A
28 {
29     public  function who()
30     {
31         A::test();
32         A::foo();
33         // echo A::$name;
34         echo $this->name;    //
35         parent::test();
36         self::test();
37         $this->test();   //self并不是必须调用static,非静态也能调用?
38     }
39 }
40
41 // A::say();
42 $b = new B;
43 $b->who();
44 // echo ‘this is non-static property‘.$b->name.‘<br>‘;
45 // echo A::$name;
46 echo ‘>>>>>>>>>>>>>>>>‘;
47 $a = new A;
48 $a->test();
49 $a->foo();
50 A::foo();
51
52 // A::test();    //在类的外部:静态访问方式不能访问非静态方法。。。但是菲静态访问方式可以访问静态方法。。。

列出几个问题:

  1. 为何可以使用A::test();这种方式访问非静态方法test()?
  2. self::test();虽然说B要继承A的test方法,但是test不是静态方法,不归类所有,为何这种方式也可以访问?self不是必须访问静态成员吗,也可以访问非静态?那self指向的是什么?

手册说明  : 静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。

在手册中看到了一个以前不知道的访问方式--------可以使用$foo::$name;来调用静态属性。$foo是对象啊!

class Foo
{
    public static $name = ‘so ga‘;
    public function _foo()
    {
        echo self::$name;
    }
}  

$foo = new Foo;
print $foo::$name;
$foo::_foo();  //调用可以输出值,,但是会报一个E_STRICT 级别的错误,,不会终止程序执行。。
$foo->_foo();

我把A::  称为静态访问方式,把$a->  称为非静态访问方式。下面都这样理解。

总结:在类的外部,静态访问方式可以访问静态方法,不能访问非静态方法(能够执行,但是用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。);非静态访问方式既可以访问静态方法,又可以访问非静态方法。

           静态访问方式可以访问静态属性,不可以访问非静态属性;非静态访问方式可以访问非静态属性,不能访问静态属性。

    在类的内部,静态访问方式既可以访问静态方法又可以访问非静态方法;非静态访问方式既可以访问静态方法,又可以访问非静态方法。

         静态访问方式只能访问静态属性,不可以访问非静态属性;非静态访问方式可以访问非静态属性,不能访问静态属性。

原文地址:https://www.cnblogs.com/bneglect/p/10962309.html

时间: 2024-10-17 04:19:43

关于对象访问静态方法、属性等问题的相关文章

JavaScript对象访问器属性

对象访问器就是setter和getter,他们的作用就是 提供另外一种方法来获取或者设置对象的属性值, 并且在获取和设置的时候,可以用一定的其他操作. 看下面代码: <script> var person = { _name : "abc", //注意此处的_name有一个下划线 }; Object.defineProperty(person,"name",{ //注意第二个参数的前面没有下划线,所以_name和name是两个不同的属性 set : fu

javascript中对象访问自身属性的方式

在javascript中,通过对象的方法访问对象自身属性时,必须采用this.fieldName的方式. 原因是javascript中Function是无状态的,访问对象的属性时,必须指定当前的上下文状态,即添加this关键字.如果没有指定,则上下文默认为window. 举例如下: 1 var obj = 2 { 3 name:"James", 4 showName:function(){ 5 alert(name); 6 } 7 } 通过控制台执行obj.showName() 输出为

js访问器属性之小问题

看js访问器属性时候 有这样一段代码 var book = { _year: 2004, edition: 1 } Object.defineProperty(book, 'year', { get: function () { return this._year; }, set: function (val) { if (val > 2004) { this._year = val; this.edition += val - 2004; } } }); book.year = 2005; c

JavaScript | 数据属性与访问器属性

属性类型 数据属性 - 包含一个数据值的位置,可以读取和写入值 [writable] 是否能修改属性的值 true [enumerable] 是否通过for in 循环返回属性(是否可以被枚举) true [configurable] 是否能通过delete删除,能否修改属性的特性,能否修改访问器属性 true [value] 包含这个属性的数据值,读取属性值的时候从这个位置读取. undefined 访问器属性 [enumerable] 是否通过for in 循环返回属性(是否可以被枚举) t

类和对象:静态属性、静态方法

在PHP中,使用关键字 static 修饰成员属性和成员方法被称为静态属性和静态方法.静态属性和静态方法不需要在类被实例化的情况下可以直接使用. 静态属性 与普通的成员属性不同,静态属性属于类本身而不属于类的任何实例.静态属性可以被看做是存储在类当中的全局变量,可以在任何地方通过类来访问它们. 由于静态属性不受任何具体对象的限制,所以不需要建立类实例,而可以直接引用类中的静态属性,使用语法格式如下: 类名称::$静态属性名称 其中,符号”::”被称作范围解析操作符,它可以用于访问静态成员.静态方

用JAVASCRIPT实现静态对象、静态方法和静态属性

Javascript语言的面向对象特征很弱,其他面向对象语言在创建类时只要使用关键字static即可指定类为静态类,Javascript没有提供static这样的关键字,要让Javascript也具有"静态"特性只有靠一些"奇技淫巧"了. 代码中列举了两种静态方法/属性的实现方式,一种是静态类的静态方法和属性,另一种是非静态类的静态方法和属性,代码说明都写在每行的代码注释里,这里就不重复了. /************************************

OGNL访问复杂对象和静态方法

今天学习了Struts的OGNL访问复杂对象和静态方法,现在来总结下. 1.OGNL访问复杂对象 (1)先创建包model.action.在model中创建模型Student(name,age).action中创建HelloAction package com.fangchao.action; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; imp

python中类对象、实例对象、类属性、实例属性、类方法、实例方法、静态方法

类对象.类属性与实例对象.实例属性的区别 在Python中一切皆是对象,类是一个特殊的对象即类对象,描述类的属性称为类属性.类属性在内存中只有一份,在__init__外部定义. 通过类创建的对象称为实例对象,描述实例对象的属性称为实例属性.实例属性在各自对象的内存中都保存一份,在__init__方法内部定义. 实例方法.类方法.静态方法的区别 这三种方法都是保存在类的内存中,调用者不同. 实例方法由对象调用,至少一个self参数,self代表对象的引用. 类方法有类调用,至少一个cls参数,并且

js对象字面量属性间相互访问的问题 和 这个问题与执行环境的关系

对象字面量属性间无法相互访问的问题: 我曾经在定义一个对象时, 并出于复用性的考虑试图复用某些属性: // test 1 var person = { firstName : "Bill", lastName : "Gates", fullName : firstName + " " + lastName // 这里报错 } alert(person.firstName); alert(person.lastName); alert(person