علیرضا
5 سال پیش توسط علیرضا مطرح شد
12 پاسخ

ارور ویک مشکل در استفاده از namespace ها

سلام من وقتی از namespace ها استفاده می کنم با ارور زیر مواجه میشم


( ! ) Error: Class 'der\PDO' not found in C:\xampp\htdocs\learn php\template\admin\clasess\db.php on line 22```
اینم کد های فایل db.php
```<?php
namespace der;

class db{
    private $pdo;
    private $tbl;
    private $user;
    private $password;
    private $server;
    private $dbname;
public function __construct($server='localhost',$dbname='tcode',$user='root',$password='')
{
    $this->dbname = $dbname;
    $this->server = $server;
    $this->password = $password;
    $this->user = $user;
    $this->connect();
}
public  function connect(){

    try{
        return $this->pdo=new PDO("mysql:host={$this->server};dbname={$this->dbname}","root",'');
    }catch(Exception $e){
        echo '<h1>مشکلی در اتصال به دیتابیس وجود دارد</h1>';
    }

}
    public function setTbl($tbl){
        $this->tbl=$tbl;
    }
}

?>```
اگه میشه کمی در مورد مشکل هم توضیح بدین که یاد بگیرم

ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
0

ببینید کامپوزر یه قابلیت اصلی داره به نام autoload که میاد تمام کلاس های تحت نیم اسپیس رو برای شما به صورت خودکار لود میکنه.
از اونجایی که شما از کامپوزر استفاده نمیکنید، روبرو شدن با خطای "Class 'der\PDO' not found" بدیهیه.
چون نمیتونه کلاس رو پیدا کنه.
در چنین حالتی باید یه تابع ساده شبیه زیر داشته باشی که این کار رو بکنه:

function __autoload($className)
{
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strripos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
    // $fileName .= $className . '.php'; //sometimes you need a custom structure
    //require_once "library/class.php"; //or include a class manually
    require $fileName;

}

اما توجه داشته باشید، که این روش گاهی هم ممکنه با خطا روبرو بشه. راه‌کار اصلی استفاده از Composer هست.
در دنیای مدرن برنامه‌نویسی PHP استفاده از Composer لازم و حیاتیه. میشه گفت تمام فریم‌ورک‌ها ازش استفاده میکنند و تمام پکیج های PHP هم همین‌طور


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
0

درود. نیم اسپیس رو می‌تونید مثل ساختار فولدرها در نظر بگیرید... تصور کنید شما ۲ تا فایل App.php دارید در فولدرهای مختلف.

هنگام استفاده از این فایل ها هنگامی که کامپوزر فایل هارو برای شما لود میکنه، اگر هر فایل نیم اسپیس خپدش رو داشته باشه براحتی در دسترس و قابل استفادست


علیرضا
تخصص : فرانت اند وب
@sep28 5 سال پیش مطرح شد
0

@ali.bayat
سلام ببخشید منظور منو اشتباه متوجه شدین
من از namespace استفاده میکنم ولی ارور میده نمیدونم چرا؟ارورش هم ذکر کردم


Reza Amini
تخصص : PHP/Laravel
@rezi 5 سال پیش مطرح شد
0

از اینکلود یا ریکوایر استفاده میکنید یا PSR ها و کامپوزر ؟


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
0

Error: Class 'der\PDO' not found

یا جایی در واردکردن نیم اسپیس ها اشتباهی رخ داده و یا تنظیمات composer.json بدرستی سِت نشدند.

همچنین اگر نیم اسپیس رو در composer.json تغییر بدید باید از دستور زیر هم استفاده کنید

composer dump-autoload

Reza Amini
تخصص : PHP/Laravel
@rezi 5 سال پیش مطرح شد
0

@ali.bayat
اقای بیات ممکنه کلا از کامپوزر استفاده نکرده باشن چون ذکر نکردن از چی استفاده کردن و با این ارور مواجه شدن


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
0

@rezi
در اون صورت که علت ارور ها هم میتونه همون باشه


علیرضا
تخصص : فرانت اند وب
@sep28 5 سال پیش مطرح شد
0

rezi@
@ali.bayat
بصورت دستی include زدم


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
0

مشکل از همین جاست.
باید در فدلدر روت پروژه تون از کامند زیر استفاده کنید

composer init

یه سری سوال میپرسه و یه فایل composer.json درست میکنه. سپس در قسمت autoload و بعدش PSR-4 باید نیم اسپیس رو اضافه کنید.

    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    },

علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
0

بعد از هر تغییراتی در فایل کامپوزر باید از dump-autoload هم استفاده کنیدو موفق باشید


علیرضا
تخصص : فرانت اند وب
@sep28 5 سال پیش مطرح شد
0

@ali.bayat
من میخام بدون کامپیوسر استفاده کنم فعلا ، چرا ارور میده؟


Reza Amini
تخصص : PHP/Laravel
@rezi 5 سال پیش آپدیت شد
0

@paressep28
نباید اروری بده در اصل شما اینکلود کن
و به این صورت آبجکتی از اون کلس ایجاد کن

include 'db.php';
$db = new der\db();

علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
0

ببینید کامپوزر یه قابلیت اصلی داره به نام autoload که میاد تمام کلاس های تحت نیم اسپیس رو برای شما به صورت خودکار لود میکنه.
از اونجایی که شما از کامپوزر استفاده نمیکنید، روبرو شدن با خطای "Class 'der\PDO' not found" بدیهیه.
چون نمیتونه کلاس رو پیدا کنه.
در چنین حالتی باید یه تابع ساده شبیه زیر داشته باشی که این کار رو بکنه:

function __autoload($className)
{
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strripos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
    // $fileName .= $className . '.php'; //sometimes you need a custom structure
    //require_once "library/class.php"; //or include a class manually
    require $fileName;

}

اما توجه داشته باشید، که این روش گاهی هم ممکنه با خطا روبرو بشه. راه‌کار اصلی استفاده از Composer هست.
در دنیای مدرن برنامه‌نویسی PHP استفاده از Composer لازم و حیاتیه. میشه گفت تمام فریم‌ورک‌ها ازش استفاده میکنند و تمام پکیج های PHP هم همین‌طور


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام