ارث بری

phpweb

Active Member
من یه کلاس والد نوشتم که یه اتصال به دیتابیس ایجاد می کنه، من می خوام این کلاس رو به عنوان کلاس والد توی یه فایل مجزا قرار بدم.

هرجا لازم بود که به دیتابیس وصل بشم، می خوام این کلاس رو اینکلود کنم.

بقیه کلاسهای مربوط به دیتابیس رو توی فایلهای جداگانه قرار می دم و می خوام هرکدوم از این کلاسها از کلاس والد ارث بری کنن.

مشکلی که دارم اینه که چطور می تونم از طریق کلاسهای فرزند، به لینک اتصال ایجاد شده در کلاس والد دسترسی پیدا کنم؟

وقتی از $this استفاده می کنم با این ارور مواجه می شم:
PHP:
Fatal error: Call to a member function real_escape_string() on a non-object in C:\xampp\htdocs\admin\model\my.php on line 43
 

Cyletech

Member
خب اولاً this به معنی همون کلاس یا در کار شما ، همون کلاس فرزند هست. شما باید از parent:: استفاده کنید. که مشخص می کنه منظور شما کلاس والد هست. کدتون هم بذارید لطفا.
 

phpweb

Active Member
خب اولاً this به معنی همون کلاس یا در کار شما ، همون کلاس فرزند هست. شما باید از parent:: استفاده کنید. که مشخص می کنه منظور شما کلاس والد هست. کدتون هم بذارید لطفا.
کدی که استفاده می کنم رو در ادامه قرار دادم.
PHP:
$id=parent::mydb->real_escape_string($id);
 

Cyletech

Member
PHP:
$id=parent::mydb->real_escape_string($id);
mydb اسم کلاس والد هست؟ اگر هست که باید برش داری چون parent:: خودش اشاره به اسمش داره. اگر اینطوری هست باید اینگونه نوشته بشه:
PHP:
parent::real_escape_string($id);
 

phpweb

Active Member
PHP:
$id=parent::mydb->real_escape_string($id);
mydb اسم کلاس والد هست؟ اگر هست که باید برش داری چون parent:: خودش اشاره به اسمش داره. اگر اینطوری هست باید اینگونه نوشته بشه:
PHP:
parent::real_escape_string($id);
mydb صفت هست و لینک اتصال رو توی خودش نگه می داره.
من می خوام این لینک توی بقیه فزندها هم استفاده بشه. برای این منظور باید چیکار کنم؟
کد کلاس والد:
PHP:
class model
{
    protected $mydb;
    function __construct()
    {
        $this->mydb= new mysqli(HOST,USER,PASS,DATABASE) or die ("error");
        $this->mydb->set_charset('UTF8');
    }
}
 
آخرین ویرایش:

Cyletech

Member
داداش من وقتی از __construct استفاده می کنی ، لازمه اش ساخت یک شیء از اون کلاسه در نتیجه رابطه پدر و فرزند صحیح نیست. یا باید دو کلاس مجزا داشته باشی یا با همان کانستراک کار کنی ولی شیء از اون کلاس در کلاس دیگر بدون رابطه پدر و فرزند بسازی.
خودم خیلی روش بررسی کردم. مرسی. :rose: و دیدم اصلاً هیچ راهی نیست اونطوری که شما میخواید عمل کرد. البته من اطلاعاتم کمه. بیشتر روش تحقیق می کنم. چیزی دستگیرم شد حتماً خبرت می کنم.
 

phpweb

Active Member
داداش من وقتی از __construct استفاده می کنی ، لازمه اش ساخت یک شیء از اون کلاسه در نتیجه رابطه پدر و فرزند صحیح نیست. یا باید دو کلاس مجزا داشته باشی یا با همان کانستراک کار کنی ولی شیء از اون کلاس در کلاس دیگر بدون رابطه پدر و فرزند بسازی.
خودم خیلی روش بررسی کردم. مرسی. :rose: و دیدم اصلاً هیچ راهی نیست اونطوری که شما میخواید عمل کرد. البته من اطلاعاتم کمه. بیشتر روش تحقیق می کنم. چیزی دستگیرم شد حتماً خبرت می کنم.
__________________
موقع استفاده از شی گرایی اونم وقتی که قراره چندتا فایل مجزا رو اینکلود کنم و تازه این فایلها باید از هم ارث بری کنن ئاقعا توی مشکل میافتم !
 

Cyletech

Member
سلام دوباره. من بیشتر روش بررسی کردم. آره عزیزم. درسته بوده حرفم. فقط یه چیزی رو جفتمون نمی دونستیم. ببین سه روش برای صدا زدن متد ها/پراپرتی های یک کلاس هست. که هر کدوم خاصیت خودشون رو دارن.
روش اول: بدون ایجاد شیء از اون کلاس و ارث بری
PHP:
class a{
public function sayHello()
{
echo('salam');
}
}
a::sayHello();
روش دوم: ایجاد شیء از اون کلاس بدون ارث بری
PHP:
class father
{
public function sayHello(){
echo('salam');
}
}

class son extends father{
public function SayHello(){
$father = new father();
$father->sayHello();
}
}
$son = new son();
$son->SayHello();
روش سوم: روش اول اما با ارث بری:
PHP:
class father{
public function sayHello(){
echo('salam');
}
}
class son extends father{
public function SayHello(){
parent::sayHello();
}
}
$son = new son();
$son->SayHello();
خاصیت هاشون:
روش اول: فقط مختص متد ها هست و وقتی برای پراپرتی ها ازش استفاده میشه خطای fatal میده که برای پراپرتی غیر static درست نیست در صورتی که اگر ایستا هم باشه باز پاسخگو نیست.
PHP:
class a{
static $text = 'salam';
public function sayHello()
{
echo('salam');
}
}
a::$text;
روش دوم: در این روش تمام متد ها و پراپرتی ها در کلاس دیگر یا فرزند (در صورت محدود نبودن) قابل دسترسی هست.

روش سوم: parent مانند روش اول عمل می کند با این تفاوت که مستقیم به کلاس والد اشاره دارد و هر خاصیتی که در روش اول هست در این روش نیز وجود دارد.

نکته هایی که تازه فهمیدم:
__construct نمی تواند static باشد.
__construct ویژه همان کلاس والد نیست! وقتی شما در __construct کلاس والد متدی رو صدا می زنید یا رشته رو چاپ می کنید ، اگر در کلاس فرزند فقط اشاره به کلاس والد شود ، چون __construct در همان شیء ساخته شده ریخته می شود یا وابسته خود کلاس والد هست ، بدون اشاره به متدی که در آن به کلاس والد اشاره شده ، خروجی چاپ می شود.
PHP:
class father
{
public function __construct(){
$this->sayHello();
}
public function sayHello()
{
echo 'saflam';
}
}

class son extends father
{
public function SayHello(){
parent::sayHello();
}
}
$son = new son();
و حالا خواسته شما ، از همان روش سوم می شه استفاده کرد. شما برای اتصال چون به return نیاز داری من از return استفاده کردم.

PHP:
class father
{
public $conn = 'salam';
public function __construct(){
return $this->conn;
}
}

class son extends father
{
public function SayHello(){
$result = parent::__construct();
echo $result;
}
}
$son = new son();
$son->SayHello();
 

جدیدترین ارسال ها

بالا