public static和private static的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了public static和private static的区别相关的知识,希望对你有一定的参考价值。

static:静态修饰符,被static修饰的变量和方法类似于全局变量和全局方法,可以在不创建对象时调用,当然也可以在创建对象之后调用。常见的可以用于工具类的工具方法中等,譬如:Math类中的绝大多数方法都是静态方法,他们扮演了工具方法的作用。
public:声明当前被修饰的对象、方法、变量为公有的。这里的公有指的是可以被公有访问,举个例子:一个类就像是一台电脑,公有的部分就是除去电脑本身之外用户可见的部分,譬如:你知道点击哪里可以登录QQ,摁哪里可以开关机,等等,你可以使用这个类所有的可见的东西都是被声明为public的,公有可见且公有可被访问的。
private:声明当前被修饰的变量、方法为私有的。这里的私有指的是仅仅可以被私有访问,举个例子:一个类就像是一台电脑,私用的部分就是除去电脑本身之外用户不可见的部分,譬如:你知道点击哪里可以登录QQ,但是内部到底是怎么登录的QQ你是不知道的,你知道摁哪里可以开关机,但是内部是怎么开关机的你是不知道的,等等,你在使用这个类时那些这个类的确有但是你访问是非法的方法或者变量是被声明为private的,私有不可见且不可访问的。
所以,被private static修饰的属性仅仅可以被静态方法调用,但是只能被本类中的方法(可以是非静态的)调用,在外部创建这个类的对象或者直接使用这个类访问都是非法的。被public static修饰的属性除了可以被静态方法和非静态调用之外,还可以直接被类名和外部创建的对象调用。
综上呢,private static是合法的,且有着其独到的用处:为静态方法提供私有静态属性。public static常用的是为该类提供对外暴露即可以被类名直接调用的静态常量。
参考技术A 你这么问想必已经知道了static的含义,
private static:字面上看private的意思是私有的,所以使用private关键字表示该变量或方法必须在本类中使用。static方法必须调用被static修饰的变量或方法。
public static:public(公共的)则表示在任何地方都能调用该方法或变量。
原理:static在JVM启动时就已经开始加载,而普通的成员变量或方法是在被调用时初始化。所以static方法必须调用被static修饰的变量或方法。本回答被提问者和网友采纳
参考技术B 访问权限不同

php-bind

  bind为类的属性值赋值,无论是public或者protect,private。格式如下:

    public static Closure::bind ( Closure $closure , object $newthis [, mixed $newscope = ‘static‘ ] ) 

    第一个参数为调用的匿名函数

    第二个参数为绑定的类,就是指匿名函数中的$this

    第三个参数为想要绑定给闭包的类作用域,或者 ‘static‘ 表示不改变。如果传入一个对象,则使用这个对象的类型名。 类作用域用来决定在闭包中 $this 对象的 私有、保护方法 的可见性。(关于这个参数没太搞懂,尝试了几次,传值就可以为私有变量赋值,不传就不可以。默认是static)

    下面的例子是为一个实例的私有变量赋值:

 1 class test {
 2     private $a = 1; 
 3 }
 4 
 5 $f = Closure::bind(function () {
 6         $this->a = 2;
 7         return $this;
 8     }, new test, test::class);
 9 
10 $o = $f();
11 $o->w();

 

  另外一种赋值形式(composer里这么写的),类似与灌入一下变量。因为不需要this,所以第二个变量设置为null就行了。

 1 class test {
 2     private $a = 1;
 3 }
 4 function b(test $o) {
 5     return Closure::bind(function () use ($o) {
 6         $o->a = 2;
 7     }, null, test::class);
 8 }
 9 
10 $o = new test();
11 call_user_func(b($o));

 

  下面例子是官网中例子,动态加载function

 1 With this class and method, it‘s possible to do nice things, like add methods on the fly to an object.
 2 
 3 MetaTrait.php
 4 <?php
 5 trait MetaTrait
 6 {
 7    
 8     private $methods = array();
 9 
10     public function addMethod($methodName, $methodCallable)
11     {
12         if (!is_callable($methodCallable)) {
13             throw new InvalidArgumentException(‘Second param must be callable‘);
14         }
15         $this->methods[$methodName] = Closure::bind($methodCallable, $this, get_class());
16     }
17 
18     public function __call($methodName, array $args)
19     {
20         if (isset($this->methods[$methodName])) {
21             return call_user_func_array($this->methods[$methodName], $args);
22         }
23 
24         throw RunTimeException(‘There is no method with the given name to call‘);
25     }
26 
27 }
28 ?>
29 
30 test.php
31 <?php
32 require ‘MetaTrait.php‘;
33 
34 class HackThursday {
35     use MetaTrait;
36 
37     private $dayOfWeek = ‘Thursday‘;
38 
39 }
40 
41 $test = new HackThursday();
42 $test->addMethod(‘when‘, function () {
43     return $this->dayOfWeek;
44 });
45 
46 echo $test->when();

 

  根据反射判断是否可绑定  

<?php

/**
* @param Closure $callable
*
* @return bool
*/
function isBindable(Closure $callable)
{
    $bindable = false;

    $reflectionFunction = new ReflectionFunction($callable);
    if (
        $reflectionFunction->getClosureScopeClass() === null
        || $reflectionFunction->getClosureThis() !== null
    ) {
        $bindable = true;
    }

    return $bindable;
}

 

以上是关于public static和private static的区别的主要内容,如果未能解决你的问题,请参考以下文章

[转] Java中public,private,final,static等概念的解读

类7(静态成员)

public , private ,static ,dim 四个的详细区别。求详解。。

ty修饰符 public private static

public class DistanceUtil private static final double EARTH_RADIUS = 6378137; private static doub

php-bind