PHP 自学笔记 (3)

今天来分享赋值、class的一些方法,static等等。

赋值by reference:

像是js的赋值就都是by reference,也就是当你去複製一个物件,而当其物件改变,会影响到原本的物件。
而我们要达到by value的效果,可以利用clone去複製物件

<?phpclass Jojo{}$a = new Jojo();// 将值物件的变数,赋予给其他变数$b = $a;// var_dump($a, $b); // object(Jojo)#1 (0) { } object(Jojo)#1 (0) { }$a->name = "big";$b->age = 22;var_dump($a, $b);// 可发现修改的为同一个物件,因为物件为by reference//object(Jojo)#1 (2) { ["name"]=> string(3) "big" ["age"]=> int(22) } //object(Jojo)#1 (2) { ["name"]=> string(3) "big" ["age"]=> int(22) }// 实现by value不影响彼此。// 可发现两个物件已经互不影响。$a = clone $b;$a->ab = 85;$b->abc = 87;var_dump($a, $b);// object(Jojo)#2 (2) { ["name"]=> string(3) "big" ["age"]=> int(22) ["ab"]=> int(85)} // object(Jojo)#1 (3) { ["name"]=> string(3) "big" ["age"]=> int(22) ["abc"]=> int(87) }

範围解析运算子(::):

透过::範围解析运算符,从外部获取class常数。

class Jojo{    const PI = 3.14;}$a = new Jojo;// echo $a->PI; // 无法获取echo Jojo::PI; //3.14

static:

获取静态成员时,使用class名 + 範围解析操作符(::) + static(属性名 or 方法)

class Car{    // 属性    public $feature = "normal";    // 普通方法    public function normal()    {        echo __FUNCTION__;    }    // 静态属性    public static $wheel = 4;    private static $oil = "full";    // 静态方法    public static function  move()    {        echo Car::$oil, __FUNCTION__, "<br/>";        // 在class中,使用$this内部物件,会报错,不可在static使用$this        // $this->move(); // Using $this when not in object context     }}

利用普通方法获取,并物件实体化,可发现只有获取到普通属性,获取不到静态属性,因为静态属性属于class,物件在实体化,并不会将静态属性引入。

而利用静态的方法去获取,可以获取class自身属性且无须物件实体化

// 普通属性获取$a = new Car();echo $a->feature . "<br/>";var_dump($a); // object(Car)#1 (1) { ["feature"]=> string(6) "normal" }echo "<br/>";// 静态属性获取echo Car::$wheel . "<br/>";// 呼叫静态方法Car::move();// 由于静态方法也都是class所定义的方法,所以也可藉由物件来获取,但不建议// $a->move();// 而普通方法在class内部,编译时就存在,我们也可透过class来获取,但不建议(会报错)// Car::normal(); // Deprecated: Non-static method Car::normal() should not be called statically

总结:
静态成员是给class获取,跟obj是毫无关係,而非静态成员是给obj获取
class可以获取普通方法(但不可带this),而obj可以无条件获取static方法
能用静态则用静态,可略过实体化,达到节省记忆体空间。

self:

当我们需要改变className,那我们所有的对应的className都需要改变,维护上较费时,所以我们能使用self来替代直接写className的方法。注意self只能在class内部使用

class Jojo{    // 属性    private static $count = 0;    // 方法    public static function showClass()    {        echo Jojo::$count;        echo "<br/>";        echo self::$count; // 可以利用self代替className     }}Jojo::showClass(); // 0

当建构式为public,我们透过物件实体化就会自动呼叫,但当建构式其为private,那么我们直接透过物件实体化就会报错,因为为private无法在class外呼叫

如果我们不透过实体化物件,无法获取class内部,但现在有static,我们可以直接透过静态的方法,因为他可不透过物件,直接获取class。而在哪里new不受影响,前提是要有其class,不管在外面在里面都可以进行实体化

class Eva{    // 设置一个private的建构式    private function __construct()    {        echo __FUNCTION__;    }    // 设置一个静态的function    public static function getInstance()    {        // 在被呼叫后我们在进行物件实体化        // 而在实体化后,就会呼叫建构式(由于都在内部所以可呼叫)        // return new Eva();        return new self();    }}// $a = new Eva;// Fatal error: Uncaught Error: Call to private Eva::__construct() from invalid context// 获取物件(透过静态,可不用先实体化就可呼叫class内部方法)$a = Eva::getInstance(); //__construct

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章