Results 1 to 5 of 5

Thread: OOP Question - Extend vs New Class

  1. #1
    Join Date
    Dec 2010

    OOP Question - Extend vs New Class

    I'm just looking for opinions on my situation in relation to oop. I'm a beginner at the moment. Basically in my site I have files, photos and I also have messages.

    Therefore I currently have a "message" class and a "file" class. Both of these currently extend a class called "general" which has several methods, all of which both of these classes make use of hence the extension of the general class in each.

    However the both of these classes now need to make use of another method called "getAuthor" which I haven't included anywhere just yet. The thing is I also have another class called "photo" which DOES NOT extend the general class (yet) however it DOES need to make use of the "getAuthor" method.

    What is the best way of handling this situation? Perhaps by creating a new class called "Author" and instantiating that class inside the other classes wherever it is needed? The other option seems to be putting getAuthor in the general class and then extending the general class in the photo class but considering the fact that the photo class uses none of the other methods in the general class this seems bad practice?

  2. #2
    Join Date
    Jul 2003
    The City of Roses
    When deciding whether to use a class or extend a class, it can be helpful to ask whether the class "is a" something or whether it "has a" something. In the case of an author, both a message and a photo "has a" author, so I think you're on the right track with creating an Author class that both the Message and Photo classes can use.

    Ideally, once implemented, you might end up writing code this way:

    PHP Code:
    $author = new Author('Joe Shmoe');

    $author = new Author('Jane Smith');

  3. #3
    Join Date
    Aug 2004
    What Jeff is (astutely) suggesting is often referred to as "composition", in case you want to try some searching on that topic. You inherit (extend) when class A "is a" class B, and you use composition when class A "uses" class B. A classic example of composition is passing a database object (such as a PDO or MySQLi object or one from your own custom class) to a data model object of some kind so that the model can access the database via the DB object.
    "Well done....Consciousness to sarcasm in five seconds!" ~ Terry Pratchett, Night Watch

    How to Ask Questions the Smart Way (not affiliated with this site, but well worth reading)

    My Blog
    cwrBlog: simple, no-database PHP blogging framework

  4. #4
    Join Date
    Nov 2011
    I would put setAuthor in the general class and extend the photo class with general if that method is required for photos also. Essentially you want to put everything in general class that belongs to all three object classes.

  5. #5
    Join Date
    Dec 2010
    Thanks very much guys. That's very clear and now I understand it perfectly

    I suppose the best approach would be to make a general folder inside my class library folder containing all general classes that are used in many places and then instantiate certain classes as and when they are needed inside other classes i.e. "new General_Author()" etc.

    @faithless - Those were my original thoughts too however the photo class doesn't use any of the other methods in the general class so it seems bad practice because I'd be including a lot of methods that the class doesn't need to implement at all.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
HTML5 Development Center



X vBulletin 4.2.2 Debug Information

  • Page Generation 0.11287 seconds
  • Memory Usage 2,882KB
  • Queries Executed 15 (?)
More Information
Template Usage (33):
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_global_above_footer
  • (1)ad_global_below_navbar
  • (1)ad_global_header1
  • (1)ad_global_header2
  • (1)ad_navbar_below
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (1)ad_thread_first_post_content
  • (1)ad_thread_last_post_content
  • (1)bbcode_php
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)headinclude_bottom
  • (5)memberaction_dropdown
  • (1)navbar
  • (4)navbar_link
  • (1)navbar_moderation
  • (1)navbar_noticebit
  • (1)navbar_tabs
  • (2)option
  • (5)postbit
  • (5)postbit_onlinestatus
  • (5)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available (6):
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files (26):
  • ./showthread.php
  • ./global.php
  • ./includes/class_bootstrap.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/functions_navigation.php
  • ./includes/class_friendly_url.php
  • ./includes/class_hook.php
  • ./includes/class_bootstrap_framework.php
  • ./vb/vb.php
  • ./vb/phrase.php
  • ./includes/functions_facebook.php
  • ./includes/functions_calendar.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_notice.php
  • ./packages/vbattach/attach.php
  • ./vb/types.php
  • ./vb/cache.php
  • ./vb/cache/db.php
  • ./vb/cache/observer/db.php
  • ./vb/cache/observer.php 

Hooks Called (72):
  • init_startup
  • friendlyurl_resolve_class
  • init_startup_session_setup_start
  • database_pre_fetch_array
  • database_post_fetch_array
  • init_startup_session_setup_complete
  • global_bootstrap_init_start
  • global_bootstrap_init_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • load_show_variables
  • load_forum_show_variables
  • global_state_check
  • global_bootstrap_complete
  • global_start
  • style_fetch
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • strip_bbcode
  • friendlyurl_clean_fragment
  • friendlyurl_geturl
  • forumjump
  • cache_templates
  • cache_templates_process
  • template_register_var
  • template_render_output
  • fetch_template_start
  • fetch_template_complete
  • parse_templates
  • fetch_musername
  • notices_check_start
  • notices_noticebit
  • process_templates_complete
  • friendlyurl_redirect_canonical
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • memberaction_dropdown
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • build_navigation_data
  • build_navigation_array
  • check_navigation_permission
  • process_navigation_links_start
  • process_navigation_links_complete
  • set_navigation_menu_element
  • build_navigation_menudata
  • build_navigation_listdata
  • build_navigation_list
  • set_navigation_tab_main
  • set_navigation_tab_fallback
  • navigation_tab_complete
  • fb_like_button
  • showthread_complete
  • page_templates