Author Topic: Overloading method trong class  (Read 2881 times)

thanhsangvnm

  • PHP Starter
  • *
  • Posts: 2
    • View Profile
Overloading method trong class
« on: August 11, 2010, 07:33:04 PM »
Từ "Overloading" ở đây không mang nghĩa là những hàm như __autoload, ...

Mà ý mình muốn đề cập đến viết nhiều method cùng tên nhưng có thông số khác nhau trong một class. Có bạn nào biết không chỉ mình với. Thanks

thanhsangvnm

  • PHP Starter
  • *
  • Posts: 2
    • View Profile
Re: Overloading method trong class
« Reply #1 on: August 11, 2010, 07:46:27 PM »
Mình đưa ra một ví dụ cho dễ hiểu.

Là mình muốn tạo ra một class có dạng như sau:

/** just a demo to understand what overloading is */
class demo {
    public function demoFunction() {
        echo 'demo Function';
    }

    public function demoFunction($message) {
       echo "demo Function with message $message";
    }
}

Cao thủ nào rành, giúp mình với, please!!!!

Neexare

  • PHP Starter
  • *
  • Posts: 24
    • View Profile
Re: Overloading method trong class
« Reply #2 on: August 12, 2010, 01:15:01 AM »
Bạn có thể overload methods trong PHP bằng inheritance. Ví dụ như sau:

class clParent{
  public function init() {
   echo 'init in clParent';
  }
}

class clChild extends clParent{
  public function init($sMessage) {
    echo 'init in clChild with message ' . $sMessage;
  }
}

™[SorivevoL]™

  • Global Moderator
  • PHP Intermediate
  • *****
  • Posts: 400
    • View Profile
    • Email
Re: Overloading method trong class
« Reply #3 on: August 12, 2010, 11:35:23 AM »
bạn Neexare đã hiểu sai giửa overriding & overloading

override là giống như bạn nói : viết 1 method trùng tên với method của lớp cha, để thay thế method của lớp cha.

còn về phần overload :
php định nghĩa khác với các ngôn ngữ khác . cho nên ví dụ của bạn thanhsangvnm đưa ra là sai. vì php không cho đặt trùng tên hàm trong cùng 1 lớp.
ví dụ của bạn chỉ đúng trong ngôn ngữ cho phép overloading .. ví dụ java , c#. khi đó overloading sẽ được hiểu là cùng 1 tên hàm, nhưng các params đưa vào khác nhau , khi đó nó sẽ sử dụng hàm theo params đó.
còn trong php. overloading nghĩa là http://php.net/manual/en/language.oop5.overloading.php
.. dịch đại khái : là để tạo ra properties hoặc methods thông qua magic methods.

tpphu

  • PHP Intermediate
  • *
  • Posts: 192
  • Trần Phong Phú
    • MSN Messenger - tpphu@yahoo.com
    • Yahoo Instant Messenger - tpphu
    • View Profile
    • Email
Re: Overloading method trong class
« Reply #4 on: August 12, 2010, 06:27:24 PM »
bạn Neexare đã hiểu sai giửa overriding & overloading

override là giống như bạn nói : viết 1 method trùng tên với method của lớp cha, để thay thế method của lớp cha.

còn về phần overload :
php định nghĩa khác với các ngôn ngữ khác . cho nên ví dụ của bạn thanhsangvnm đưa ra là sai. vì php không cho đặt trùng tên hàm trong cùng 1 lớp.
ví dụ của bạn chỉ đúng trong ngôn ngữ cho phép overloading .. ví dụ java , c#. khi đó overloading sẽ được hiểu là cùng 1 tên hàm, nhưng các params đưa vào khác nhau , khi đó nó sẽ sử dụng hàm theo params đó.
còn trong php. overloading nghĩa là http://php.net/manual/en/language.oop5.overloading.php
.. dịch đại khái : là để tạo ra properties hoặc methods thông qua magic methods.
Hoàn toàn đồng ý với ý kiến của bạn.
Cũng cần nói thêm tí nữa rằng việc không cho đặt tên hàm trùng theo kinh nghiệm của tôi biết thì không phân biệt nó la public hay gì khác, kể cả có static hay không v.v... và không phân biệt hoa thường luôn.

Nhưng nếu bạn muốn viết vậy thì dùng magic function để làm cũng okay, tất nhiên nếu bạn code bằng IDE như Netbean thì có thể hơi rắc rối một tí vì bạn dùng auto-complete sẽ không được. Nhưng đâu cần đúng hem? :)
Chúc vui.
« Last Edit: August 12, 2010, 06:29:03 PM by tpphu »

Neexare

  • PHP Starter
  • *
  • Posts: 24
    • View Profile
Re: Overloading method trong class
« Reply #5 on: August 17, 2010, 03:48:59 PM »
Ah, mình xin lỗi. Mình đã sử dụng sai từ. Nhưng theo mình tháy thì nên dùng overriding để giải quyết vấn đề cũa bạn thanhsangvnm. Vì đúng như những bạn đã nói thì PHP thật ra không ủng hộ overloading cho methods ngoài cách dùng magic methods. Nhưng magic methods thì không có tối ưu, và là một giải pháp xấu xí.