PHP: nom allaqachon ishlatilayotganligi sababli sinf e'lon qila olmaydi

Menda 5 ta skript mavjud: database.php, parent.php, child1.php, child2.php va somescript.php

parent.php klassi shunga o'xshash:

include 'database.php';

class Parent {
    public $db;
    function __construct() {
        $this->db = new Database();
    }
}

child1 va child2 kurslari shunga o'xshash:

include 'parent.php';

class Child1 extends Parent {
    function __construct() {
        parent::__construct();
    }

    function useDb() {
        $this->db->some_db_operation();
    }
}

Muammo

Child1 va child2ni somescript.php ichida ham o'z ichiga oladigan bo'lsak, u holda quyidagi xato qaytaradi:

Ma'lumotlar bazasini e'lon qilolmaydi, chunki nom allaqachon ishlatilmoqda   4-satrda database.php (bu "sinf ma'lumotlar bazasini" o'z ichiga olgan satr)

Ammo faqat bitta faylni (child1 yoki child2) kiritadigan bo'lsam, u ajoyib ishlaydi.

Buni qanday o'zgartirish mumkin?

13
Buning o'rniga include_once harakat qilib ko'ring yoki autoloader foydalaning.
qo'shib qo'ydi muallif Jeff Lambert, manba
@JeffLambert Ha, menga yordam berdi. Rahmat!
qo'shib qo'ydi muallif egorik, manba
skriptingiz boshqa PHP fayllarini talab qilsa, muqobil ravishda require_once dan foydalaning.
qo'shib qo'ydi muallif Dimi, manba

7 javoblar

include_once() yoki require_once() . Boshqa variant esa, barcha sinfingiz to'g'ri tartibda o'z ichiga olgan qo'shimcha fayl yaratishdir, shuning uchun qo'ng'iroq qilishlari shart emas:

"classes.php"

include 'database.php';
include 'parent.php';
include 'child1.php';
include 'child2.php';

Shunda sizga kerak:

require_once('classes.php');
11
qo'shib qo'ydi
@Dan, siz hali ham o'zingizning buyurtmangizning tartibini tekshirishingiz kerak, shuning uchun sinf tanlansa, yuqori sinf (lar) allaqachon qo'shilgan.
qo'shib qo'ydi muallif M31, manba
Men loyihada hamma joylarga qo'shilgan narsalarni qo'shib qo'ydim va bu hali hammasi bo'ladi. U ilgari ishlagan
qo'shib qo'ydi muallif Dan, manba

include_once() yoki require_once() . Boshqa variant esa, barcha sinfingiz to'g'ri tartibda o'z ichiga olgan qo'shimcha fayl yaratishdir, shuning uchun qo'ng'iroq qilishlari shart emas:

"classes.php"

include 'database.php';
include 'parent.php';
include 'child1.php';
include 'child2.php';

Shunda sizga kerak:

require_once('classes.php');
11
qo'shib qo'ydi
@Dan, siz hali ham o'zingizning buyurtmangizning tartibini tekshirishingiz kerak, shuning uchun sinf tanlansa, yuqori sinf (lar) allaqachon qo'shilgan.
qo'shib qo'ydi muallif M31, manba
Men loyihada hamma joylarga qo'shilgan narsalarni qo'shib qo'ydim va bu hali hammasi bo'ladi. U ilgari ishlagan
qo'shib qo'ydi muallif Dan, manba

try to use use include_onceor require_once instead of include or require

1
qo'shib qo'ydi

try to use use include_onceor require_once instead of include or require

1
qo'shib qo'ydi

Another option to include_once or require_once is to use class autoloading. http://php.net/manual/en/language.oop5.autoload.php

0
qo'shib qo'ydi

Men bu muammoni oldindan tuzib chiqardim va buni tuzatish uchun, Faqat ishonch hosil qiling:

  1. Ushbu klass namunasini
  2. oldidan yaratmadingiz
  3. Agar buni sinf usulidan chaqirsangiz, __destruct siz chaqirgan sinfga o'rnatilganligiga ishonch hosil qiling.

Mening muammom (oldin):
Menda sinf bor edi: Core, Router, Permissions and Render Core o'z ichiga Router sinfidan, Router keyinchalik Permissions sinfini chaqiradi, keyin Router __destruct Render sinfini chaqiradi va "Nomlar allaqachon ishlatilayotganligi sababli sinfni e'lon qila olmaydi" xatosi paydo bo'ldi.

Biznes: Permission sinfidagi __destruct qo'shildim va __destruct bo'sh edi va u belgilangan ...

0
qo'shib qo'ydi

Men bu muammoni oldindan tuzib chiqardim va buni tuzatish uchun, Faqat ishonch hosil qiling:

  1. Ushbu klass namunasini
  2. oldidan yaratmadingiz
  3. Agar buni sinf usulidan chaqirsangiz, __destruct siz chaqirgan sinfga o'rnatilganligiga ishonch hosil qiling.

Mening muammom (oldin):
Menda sinf bor edi: Core, Router, Permissions and Render Core o'z ichiga Router sinfidan, Router keyinchalik Permissions sinfini chaqiradi, keyin Router __destruct Render sinfini chaqiradi va "Nomlar allaqachon ishlatilayotganligi sababli sinfni e'lon qila olmaydi" xatosi paydo bo'ldi.

Biznes: Permission sinfidagi __destruct qo'shildim va __destruct bo'sh edi va u belgilangan ...

0
qo'shib qo'ydi
PhP |BotsUz
PhP |BotsUz
93 ishtirokchilar

Phpni o'rganishni Hohlasangiz https://t.me/joinchat/AAAAAE-KRc5dd5tPMmGmWA A'zo bo'lin