Pertanyaan Bagaimana cara Menggunakan Kelas Batin di PHP?


Saya dari latar belakang Java, dan saya ingin menggunakan kelas batin di php. Setiap kali saya menempatkan kelas batin, saya mendapatkan kesalahan sintaks. Apakah ini mungkin dengan PHP? Juga, bagaimana cara mereferensikan kelas luar? Apakah saya mendapatkan akses ke SEMUA anggota datanya?

<?php

class OuterClass {
    var $x = 15;
    function __construct() {

    }

    class InnerClass {                  // error when InnerClass is static
        function __construct() {        // error when InnerClass is static
            echo $x;
        }
    }
}

?>

Ini digunakan untuk MoveClass (seperti dalam gerakan) dari permainan kartu tertentu. Saya pikir itu akan menjadi desain yang baik untuk menempatkan kelas-kelas ini bersama-sama karena mereka tidak masuk akal terpisah. Juga, MoveClass perlu tahu tentang beberapa anggota data dari kelas Game. Mengapa tidak menjadikannya berfungsi? Itu terlalu besar.

Edit:

Bagaimana dengan kelas bertingkat? Dari apa yang saya pahami, itu harus statis? O_o


32
2017-12-04 03:32


asal


Jawaban:


PHP tidak memungkinkan untuk kelas batin. Jika Anda ingin mengakses semua anggota data dari kelas induk, saya sarankan Anda menggunakan Warisan.

Alternatif yang mungkin:

class OuterClass {
    var $x = 15;
    function __construct() {

    }
}
class ChildClass extends OuterClass {
    function __construct() {
        parent::__construct();
    }
}

Anda dapat menambahkan metode membentuk kelas induk dengan mengacu pada kelas itu sendiri; Di PHP Anda dapat melakukan ini dengan parent kata kunci. Jadi, untuk merujuk ke metode dalam konteks kelas daripada objek yang kita gunakan :: sebagai lawan ->.


20
2017-12-04 03:41



di PHP 5.4 atau yang lebih baru, Anda dapat menggunakan PHP Traits yang dirancang lebih untuk multiple inheritance, tetapi mungkin sesuai dengan kebutuhan Anda. Dari Dokumentasi PHP:

Trait mirip dengan kelas, tetapi hanya ditujukan untuk grup   fungsionalitas dengan cara yang halus dan konsisten. Ini tidak mungkin   untuk menginstansiasi Trait sendiri. Ini adalah tambahan tradisional   warisan dan memungkinkan komposisi perilaku horisontal; itu adalah,   penerapan anggota kelas tanpa mewajibkan warisan.

http://php.net/manual/en/language.oop5.traits.php


5
2018-05-31 16:42



Seperti yang disebutkan di komentar untuk jawaban ini dari pertanyaan lain, versi PHP dari fungsi ini telah ditambahkan dalam PHP 7. Tampaknya tidak memberikan apa yang Anda minta. Namun, itu harus memberi Anda pola desain yang sama.

Inilah RFC yang menjelaskan cara kerjanya: https://wiki.php.net/rfc/anonymous_classes 

Seperti disebutkan dalam jawaban jawaban lainnya, cari halaman RFC untuk "bersarang" untuk melihat contoh bersarang di dalam kelas luar.


2
2017-08-25 00:24



Anda mungkin ingin menggunakan stdClass sebagai gantinya. Berikut pertanyaan SO tentang hal itu: Apa itu stdClass di PHP?


1
2017-12-04 04:50



Anda tidak dapat mengumpulkan kelas seperti itu.

Lihatlah bagian "memanjang" dari manual.


0
2017-12-04 03:35