Sifat php menimpa metode induk

Dan Anda ingin menambahkan beberapa perubahan pada metode ini. Anda dapat mencoba menimpanya dan menggunakan struktur parent:: seperti ini

class SomeClass {
    use SomeTrait;

    public function increment(int $value): int
    {
        if ($value === 2) {
            return 0;
        }

        return parent::increment($value);
    }
}

$some = new SomeClass();

var_dump($some->increment(1));

Tapi itu akan gagal dengan kesalahan seperti Cannot access parent:: when current class scope has no parent. Itu karena sifat bukanlah kelas, perilakunya berbeda. Untuk membuatnya berfungsi, Anda dapat menggunakan solusi berikutnya

Jika kelas mengimplementasikan metode secara langsung, itu tidak akan menggunakan versi ciri. Mungkin yang Anda pikirkan adalah

trait A {
    function calc($v) {
        return $v+1;
    }
}

class MyClass {
    function calc($v) {
        return $v+2;
    }
}

class MyChildClass extends MyClass{
}

class MyTraitChildClass extends MyClass{
    use A;
}

print (new MyChildClass())->calc(2); // will print 4

print (new MyTraitChildClass())->calc(2); // will print 3
_

Karena kelas anak tidak mengimplementasikan metode secara langsung, mereka pertama-tama akan menggunakan sifat jika ada yang menggunakan kelas induk

Jika Anda mau, sifat itu bisa menggunakan metode di kelas induk (dengan asumsi Anda tahu metode itu ada di sana) e. g

Saya mengalami situasi baru-baru ini di mana saya ingin mengubah tanda tangan metode untuk metode yang disuntikkan ke dalam kelas melalui suatu sifat, yaitu mengubah parameter default. Saya ingin melakukan ini jadi saya tidak perlu meneruskan parameter default baru di setiap tempat yang saya panggil metode ini di kelas khusus ini

Mengesampingkan metode, cukup mudah. Segera setelah metode baru dideklarasikan di kelas dengan nama yang sama, metode sifat akan diganti. Bagian yang sulit adalah memanggil metode 'induk' dari metode 'anak', jadi saya tidak perlu menduplikasi logika di dalam metode baru saya. Saya mencoba parent::methodName() dan TraitName::methodName() sebelum lari ke mesin google untuk mempelajari cara yang tepat untuk melakukan ini

Ternyata semudah membuat alias untuk nama metode sifat dalam pernyataan "Gunakan", yang masuk akal setelah saya melihatnya

Jadi, jika ini adalah sifat yang ingin Anda gunakan dan timpa

trait SomeTrait {
    public function someMethod(string $key = 'Id')
    {
        // logic
        return $resultOfLogic;
    }
}

Berikan saja alias pada nama metode sifat saat "Menggunakan" sifat tersebut

use SomeTrait {someMethod as public traitSomeMethod;}

Ini contoh lengkapnya

<?php

class Something
{
    use SomeTrait {someMethod as public traitSomeMethod;}

    public function someMethod(string $key = 'Name')
    {
        return $this->traitSomeMethod($key);
    }
}

Jadi sekarang saya bisa memanggil metode ini pada contoh apa pun dari kelas ini tanpa secara eksplisit meneruskan default $key setiap kali saya perlu memanggilnya. Juga, saya mendapat manfaat tambahan karena tidak harus menduplikasi logika, menjaga semuanya tetap KERING dan memastikan bahwa setiap perubahan yang dilakukan pada logika sifat akan 'menggelembung' ke implementasi kelas yang konkret.

Pertimbangkan contoh ini, ketika kita memiliki sifat dan kelas yang menggunakan sifat ini. Tapi kami ingin mengganti metode suatu sifat dan juga kami ingin memanggil metode sifat awal. Bagaimana kita bisa melakukannya?

<?php

trait Calculates {
    function calc($value) {
        return $v + 1;
    }
}

class Calculator {
    use Calculates {
    }

    function calc($value) {
        $v++;
        // call trait's method
    }
}
_

Kita dapat menggunakan mekanisme penyelesaian konflik sifat. Kita dapat mengganti nama metode sifat dengan menggunakan kata kunci as. Kami juga dapat mengubah visibilitasnya untuk menghapusnya dari antarmuka publik kelas

<?php

trait Calculates {
    function calc($value) {
        return $v + 1;
    }
}

class Calculator {
    use Calculates {
        calc as protected calculate;
    }

    function calc($value) {
        $v++;
        return $this->calculate($this);
    }
}

Sekarang, ini berhasil

Bisakah saya mengganti metode sifat di PHP?

Fungsi sifat dapat diganti hanya dengan mendefinisikan fungsi dengan nama yang sama di kelas . Sekarang (KelasSaya baru)->sayHi(); .

Bagaimana Anda mengganti kelas induk di PHP?

Untuk mengganti metode, Anda mendefinisikan ulang metode tersebut di kelas anak dengan nama, parameter, dan jenis pengembalian yang sama . Metode di kelas induk disebut metode overridden, sedangkan metode di kelas anak dikenal sebagai metode overriding.

Apa itu Tret di PHP?

Apa itu sifat ? . Sederhananya, sifat memungkinkan Anda membuat metode yang diinginkan dalam pengaturan kelas, menggunakan kata kunci sifat. Anda kemudian dapat mewarisi kelas ini melalui penggunaan kata kunci. a way to enable developers to reuse methods of independent classes that exist in different inheritance hierarchies. Simply put, traits allow you to create desirable methods in a class setting, using the trait keyword. You can then inherit this class through the use keyword.

Bisakah sifat memiliki metode pribadi?

Sifat digunakan untuk mendeklarasikan metode yang dapat digunakan di banyak kelas. Sifat dapat memiliki metode dan metode abstrak yang dapat digunakan di banyak kelas, dan metode dapat memiliki pengubah akses apa pun (publik, pribadi, atau dilindungi) .