程序员面试题之Static方法与普通方法有啥不同,静态方法可以不依赖于类的实例,可以直接通过类名调用,并可以访问和修改静态属性;普通方法需要通过类的实例对象调用,并可以访问和修改实例属性。

本文主要是介绍程序员面试题之Static方法与普通方法有啥不同,静态方法可以不依赖于类的实例,可以直接通过类名调用,并可以访问和修改静态属性;普通方法需要通过类的实例对象调用,并可以访问和修改实例属性。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AI:please wait…
在PHP中,静态方法(Static methods)与普通方法(Instance methods)有以下不同:

  1. 调用方式:静态方法可以通过类名直接调用,而普通方法需要通过类的实例对象调用。
    示例:

    class MyClass {public static function staticMethod() {echo "This is a static method.";}public function instanceMethod() {echo "This is an instance method.";}
    }MyClass::staticMethod(); // 调用静态方法
    $obj = new MyClass();
    $obj->instanceMethod(); // 调用普通方法
    
  2. 访问权限:静态方法可以访问和修改静态属性(Static properties),而普通方法可以访问和修改实例属性(Instance properties)。
    示例:

    class MyClass {public static $staticProperty = "Static Property";public $instanceProperty = "Instance Property";public static function staticMethod() {echo self::$staticProperty;}public function instanceMethod() {echo $this->instanceProperty;}
    }MyClass::staticMethod(); // 输出 "Static Property"
    $obj = new MyClass();
    $obj->instanceMethod(); // 输出 "Instance Property"
    
  3. 继承:静态方法可以被继承并覆盖(Override),而普通方法也可以被继承并覆盖。
    示例:

    class ParentClass {public static function staticMethod() {echo "This is the parent's static method.";}public function instanceMethod() {echo "This is the parent's instance method.";}
    }class ChildClass extends ParentClass {public static function staticMethod() {echo "This is the child's static method.";}public function instanceMethod() {echo "This is the child's instance method.";}
    }ParentClass::staticMethod(); // 输出 "This is the parent's static method."
    ChildClass::staticMethod(); // 输出 "This is the child's static method."$parentObj = new ParentClass();
    $parentObj->instanceMethod(); // 输出 "This is the parent's instance method."$childObj = new ChildClass();
    $childObj->instanceMethod(); // 输出 "This is the child's instance method."
    

https://www.php.net/manual/zh/language.oop5.static.php
声明类属性或方法为静态,就可以不实例化类而直接访问。
静态方法

<?php/*** 静态(static)关键字** 声明类属性或方法为静态,就可以不实例化类而直接访问。* 静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)** 由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用!!*/class Foo
{public static function aStaticMethod(){// ...echo '静态方法调用';}
}//两种静态方法的调用方式
Foo::aStaticMethod();
//$classname = 'Foo';
//$classname::aStaticMethod();

静态方法&&静态变量

<?php/*** 静态(static)关键字,静态属性** 静态属性不可以由对象通过 -> 操作符来访问。* 通过变量来引用一个类是可行的,但这个变量的值不能是一个保留字 (例如self,parent和 static)*/class Foo
{public static $my_static = '静态变量:foo';public function staticValue(){return self::$my_static;}
}class Bar extends Foo
{public function fooStatic(){return parent::$my_static;}
}print Foo::$my_static . "\n"; //直接调用静态变量//静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
$foo = new Foo();
print $foo->staticValue() . "\n";   //可以访问静态方法
//print $foo->my_static . "\n";      // 会报错的,静态属性不可以由对象通过 -> 操作符来访问。echo '<br/>';
echo '<br/>';
echo '<br/>';$foo = new Foo();
print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n";echo '<br/>';
echo '<br/>';
echo '<br/>';//Bar是子类访问父类的静态变量
print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";echo '<br/>';
print $bar->staticValue();

继承会覆盖

<?php/*** 继承会覆盖*/class A
{static protected $test = "class a";public function static_test(){echo static::$test; //打印什么??    class becho '<br/>';echo self::$test; //打印什么??      class a}
}class B extends A
{static protected $test = "class b";
}$obj = new B();
$obj->static_test();

静态成员由类的所有实例共享,尽管类的每个实例都存在一个非静态成员。

<?php/***  也就是说,静态成员由类的所有实例共享,尽管类的每个实例都存在一个非静态成员。*/class Base
{public $a;public static $b;
}class Derived extends Base
{public function __construct(){$this->a = 0;parent::$b = 0;}public function f(){$this->a++;parent::$b++;}
}$obj1 = new Derived();
$obj2 = new Derived();
$obj3 = new Derived();$obj1->f();
echo $obj1->a;echo Derived::$b; //11echo '<br/>';
echo '<br/>';$obj2->f();
echo $obj2->a;echo Derived::$b; //12echo '<br/>';
echo '<br/>';$obj3->f();
echo $obj3->a;echo Derived::$b; //13

要检查类中声明的方法是否是静态的,可以使用以下代码。PHP5有一个反射类,非常有用

<?phpclass base
{public static function test(){}public function test1(){}
}try {$method = new ReflectionMethod('base::test');if ($method->isStatic()) {echo 'yes';} else {echo 'no';}
} catch (ReflectionException $e) {echo $e->getMessage();
}

修饰全局作用域的变量

<?phpfunction testStatic()
{static $val = 1; //修饰全局作用域的变量echo $val;$val++;
}/*** 在函数执行完后,变量值仍然保存*/
testStatic(); //echo 1
testStatic(); //echo 2
testStatic(); //echo 3

这里static的作用即类似于C里的static的作用,保证$a变量只有在add()第一次调用时才会被初始化
但需要注意的是定义static变量的时候,可以不赋初值,可以给定初值,
但是赋初值的时候不能使用表达式或者调用函数赋值,否则会报错。

    //www.kegog11.com/admin/demo/testpublic function test(){for($i=0;$i<5;$i++){static $a = 0;echo $a,"<br />";$a++;}echo $a,"<br />";}//结果集?

static变量不会存储引用(但是可以存储对象)
当static存储引用时,二次调用函数后,该变量的值并未被保存下来,
且运行上面程序会报Deprecated错误,即返回引用值赋值的用法已弃。

<?phpfunction get_obj_ref(){static $obj = null;echo '第一个:Ststic obj:';var_dump($obj);echo '<br/>';if(is_null($obj)){$obj = &new stdClass();}return $obj;
}
$obj = get_obj_ref();
$obj2 = get_obj_ref();//====================================================
echo '<br/>';function get_obj_noref(){static $obj = null;echo '第二个:Ststic obj:';var_dump($obj);echo '<br/>';if(is_null($obj)){$obj = new stdClass();}return $obj;
}
$obj = get_obj_noref();
$obj2 = get_obj_noref();

static在类中的延迟静态绑定;

/*** 2:static在类中的延迟静态绑定;** 延迟静态绑定是指允许在一个静态继承的上下文中引用被调用类。* 延迟绑定的意思为:* static::不再为定义当前方法所在的类,而是实际运行时所在的类。注:它可以用于(但不限于)静态方法的调用。** 除了简单的static延迟绑定的用法,还有一种转发调用,即使用self::,* parent::,static:: 以及forward_static_call()(该函数只能在方法中调用)将转发调用信息,如下:*/class A
{public static function foo(){static::who();}public static function who(){echo __CLASS__ . "\n";}
}class B extends A
{public static function test(){A::foo();parent::foo();self::foo();}public static function who(){echo __CLASS__ . "\n";}
}class C extends B
{public static function who(){echo __CLASS__ . "\n";}
}C::test();//这里得到的结果是A C C,显然在调用parent::foo()时,还是使用了运行时调用类。

还有一点需要注意的是:只有显示声明的static类才是从属与子类的。

<?php
/*** 还有一点需要注意的是:只有显示声明的static类才是从属与子类的。** 这里得到的结果是 b b。这里B类首先调用过test()方法,调用后$var2变量已经被赋值,* 而C类未定义自己的$var2变量,且父类中$var2变量值已经存在,* 故直接使用,若在B C类中显示定义$var2变量,则结果又会有所不同。*/class A
{protected static $var1 = null;protected static $var2 = null;public static function test(){if (!static::$var2) {static::$var2 = static::$var1;}echo get_called_class() . '===>' . static::$var2 . '<br/>';}
}class B extends A
{protected static $var1 = 'b';
}class C extends A
{protected static $var1 = 'c';
}B::test();
C::test();

这篇关于程序员面试题之Static方法与普通方法有啥不同,静态方法可以不依赖于类的实例,可以直接通过类名调用,并可以访问和修改静态属性;普通方法需要通过类的实例对象调用,并可以访问和修改实例属性。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116363

相关文章

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T