RuleBritannia Posted December 17, 2013 Share Posted December 17, 2013 So, Throughout my script it seemed logically correct to call a function via a variable value. Example I have function computer() { return 'pcs are good'; } function laptop() { return 'laptops are ok'; } $value = 'computer'; echo $value(); $value = 'laptop'; echo $value(); However, After just googling this, I saw alot of criticism towards this technique, Whats the problem with this? Thanks in advance. Quote Link to comment https://forums.phpfreaks.com/topic/284820-why-is-doing-this-bad/ Share on other sites More sharing options...
Solution requinix Posted December 17, 2013 Solution Share Posted December 17, 2013 No support from the IDE about what is executing. No help from your IDE about possible errors. No idea where all the computer/laptop functions are being called. Slow function calls. Prone to bugs that can be difficult to track down. Lends itself to magical behaviors that are crazy to maintain and support. Adds another attack vector to your code. Using a feature just for the sake of using a feature. Unreadable. Quote Link to comment https://forums.phpfreaks.com/topic/284820-why-is-doing-this-bad/#findComment-1462584 Share on other sites More sharing options...
RuleBritannia Posted December 17, 2013 Author Share Posted December 17, 2013 No support from the IDE about what is executing. No help from your IDE about possible errors. No idea where all the computer/laptop functions are being called. Slow function calls. Prone to bugs that can be difficult to track down. Lends itself to magical behaviors that are crazy to maintain and support. Adds another attack vector to your code. Using a feature just for the sake of using a feature. Unreadable. Thanks for your in depth response, But I wanted to ask 1-2 questions. "No support from the IDE about what is executing." I dont use a IDE, Just notepad. "No help from your IDE about possible errors" Again. "Slow function calls." So this actually causes more resources? A big amount or? "Prone to bugs that can be difficult to track down." If you captured error messages at all, Wouldnt the same apply however you called the function? "Adds another attack vector to your code." Yeh I can see this is a good point. Overlooked this. "Using a feature just for the sake of using a feature." It was logical in this case from my view at the time, so wasnt just out of the sake. "Lends itself to magical behaviors that are crazy to maintain and support." What other magical behaviors could those be? "Unreadable." Yes I guess, but only planned to use it once. Quote Link to comment https://forums.phpfreaks.com/topic/284820-why-is-doing-this-bad/#findComment-1462588 Share on other sites More sharing options...
requinix Posted December 17, 2013 Share Posted December 17, 2013 "No support from the IDE about what is executing." I dont use a IDE, Just notepad. "No help from your IDE about possible errors" Again. When you're ready to become a serious programmer, start looking into the tons of PHP IDEs available. "Slow function calls." So this actually causes more resources? A big amount or? A small but unnecessary amount. "Prone to bugs that can be difficult to track down." If you captured error messages at all, Wouldnt the same apply however you called the function? But where did $value get set to the wrong function? Is it happening that way in more than one place? It's a rabbit hole. "Lends itself to magical behaviors that are crazy to maintain and support." What other magical behaviors could those be? "Magical", as in "we don't know quite how or why the variables are set to what they are so as far as you're concerned it's magical". Put like that there are tons of things that could qualify as magical. PHP even has things called "magic methods" (__get and __set and such) which are only demystified once you learn how the trick works, but until you learn about them being able to set values on member variables even though they don't exist is "magical". Magical behavior is bad because you don't know why things work the way they do. Magical behavior is difficult to track down and often harder to change. It is poor practice because it impedes your work and the work of anybody who has to maintain the code in the future. Some PHP programmers avoid __get/set and such for that same reason, though not as much because they're firmly entrenched in its implementation of object-oriented programming. Variable variables are not; should they ever be then doing things like echo $value(); may gain wider acceptance... provided all the other problems with it are dealt with. With all that said, sometimes there are legitimate uses for it. What I'm saying is that your example, and in fact most times I see it, is not one of them. Maybe you'd like to elaborate on what exactly you were planning? Quote Link to comment https://forums.phpfreaks.com/topic/284820-why-is-doing-this-bad/#findComment-1462592 Share on other sites More sharing options...
RuleBritannia Posted December 17, 2013 Author Share Posted December 17, 2013 When you're ready to become a serious programmer, start looking into the tons of PHP IDEs available. A small but unnecessary amount. But where did $value get set to the wrong function? Is it happening that way in more than one place? It's a rabbit hole. "Magical", as in "we don't know quite how or why the variables are set to what they are so as far as you're concerned it's magical". Put like that there are tons of things that could qualify as magical. PHP even has things called "magic methods" (__get and __set and such) which are only demystified once you learn how the trick works, but until you learn about them being able to set values on member variables even though they don't exist is "magical". Magical behavior is bad because you don't know why things work the way they do. Magical behavior is difficult to track down and often harder to change. It is poor practice because it impedes your work and the work of anybody who has to maintain the code in the future. Some PHP programmers avoid __get/set and such for that same reason, though not as much because they're firmly entrenched in its implementation of object-oriented programming. Variable variables are not; should they ever be then doing things like echo $value(); may gain wider acceptance... provided all the other problems with it are dealt with. With all that said, sometimes there are legitimate uses for it. What I'm saying is that your example, and in fact most times I see it, is not one of them. Maybe you'd like to elaborate on what exactly you were planning? Thanks. In regards to what im planning, more like already planned and executed. I have some scripts which pull data from a table, this table data like name > core i7 brand > intel for each brand I have made functions, which have the settings for the brand pages(diff bg , header sizes, etc) When I query the table, I can call the function like $query['brand'](); So whatever is that value, the corresponding function will be called. Quote Link to comment https://forums.phpfreaks.com/topic/284820-why-is-doing-this-bad/#findComment-1462593 Share on other sites More sharing options...
RuleBritannia Posted December 17, 2013 Author Share Posted December 17, 2013 As for how the data got in the table, I set it myself, So there wont be any brands without a function etc, Either way, This example probably falls into your "illegitimate" uses for this methodology. If you care to provide a example, How would you personally deal with this? Thanks in advance. Quote Link to comment https://forums.phpfreaks.com/topic/284820-why-is-doing-this-bad/#findComment-1462596 Share on other sites More sharing options...
KevinM1 Posted December 18, 2013 Share Posted December 18, 2013 As for how the data got in the table, I set it myself, So there wont be any brands without a function etc, Either way, This example probably falls into your "illegitimate" uses for this methodology. If you care to provide a example, How would you personally deal with this? Thanks in advance. What do you mean "there won't be any brands without a function?" Quote Link to comment https://forums.phpfreaks.com/topic/284820-why-is-doing-this-bad/#findComment-1462599 Share on other sites More sharing options...
objnoob Posted December 18, 2013 Share Posted December 18, 2013 you create a function that accepts the brand. function isBrandOkay($brand){ switch(strtolower($brand)){ case 'laptop': return true; case 'computer': return true; } return false; } $thisBrand = 'computer'; echo $thisBrand . ((isBrandOkay($thisBrand)) ? ' is okay!' : ' is <b>not</b> okay'); Quote Link to comment https://forums.phpfreaks.com/topic/284820-why-is-doing-this-bad/#findComment-1462601 Share on other sites More sharing options...
ignace Posted December 18, 2013 Share Posted December 18, 2013 (edited) objnoob is on to the right idea. function setSettingsForBrand($brand) { switch ($brand) { case 'intel': setIntelSettings(); break; default: setDefaultSettings(); break; } }So in the case of where you have a brand with no corresponding function, or misspelled the brand name, your application wouldn't error out but instead simply apply the default. Magic is cool, but not in your code. Because in the end it will pull it's greatest trick on you. Edited December 18, 2013 by ignace Quote Link to comment https://forums.phpfreaks.com/topic/284820-why-is-doing-this-bad/#findComment-1462614 Share on other sites More sharing options...
mac_gyver Posted December 18, 2013 Share Posted December 18, 2013 here is a 'test' that shows why you wouldn't write code with functions (or variables) named after specific categories/manufactures/brands.... - to add, remove, or change a category/manufacturer/brand..., you should not find yourself writing or editing program logic. your program logic should be general purpose so that it can operate on any number of categories/manufactures/brands simply by defining the necessary 'data' entries somewhere (database tables, arrays, xml, serialized/json data.) i'm betting the only thing your named hard-coded functions are doing differently between them is in the data values that are being assigned? if so, you have taken a data driven design and hard-coded it into your program so that it now requires a "programmer" to perform a simple operation like adding a new brand or changing one of the values. this will get you escorted out the door in a real business. anyone (authorized to do so) should be able to add/change categories/manufactures/brands through a user interface that modifies stored data values, not by adding/modifying functions in the code. Quote Link to comment https://forums.phpfreaks.com/topic/284820-why-is-doing-this-bad/#findComment-1462618 Share on other sites More sharing options...
RuleBritannia Posted December 18, 2013 Author Share Posted December 18, 2013 (edited) What do you mean "there won't be any brands without a function?" If there was no function to match the brand, When calling $brand(); it wouldnt work. objnoob is on to the right idea. function setSettingsForBrand($brand) { switch ($brand) { case 'intel': setIntelSettings(); break; default: setDefaultSettings(); break; } }So in the case of where you have a brand with no corresponding function, or misspelled the brand name, your application wouldn't error out but instead simply apply the default. Magic is cool, but not in your code. Because in the end it will pull it's greatest trick on you. This approach looks better, thanks here is a 'test' that shows why you wouldn't write code with functions (or variables) named after specific categories/manufactures/brands.... - to add, remove, or change a category/manufacturer/brand..., you should not find yourself writing or editing program logic. your program logic should be general purpose so that it can operate on any number of categories/manufactures/brands simply by defining the necessary 'data' entries somewhere (database tables, arrays, xml, serialized/json data.) i'm betting the only thing your named hard-coded functions are doing differently between them is in the data values that are being assigned? if so, you have taken a data driven design and hard-coded it into your program so that it now requires a "programmer" to perform a simple operation like adding a new brand or changing one of the values. this will get you escorted out the door in a real business. anyone (authorized to do so) should be able to add/change categories/manufactures/brands through a user interface that modifies stored data values, not by adding/modifying functions in the code. I would not do this in a program which is created for people other than myself, This application is just for me. Edited December 18, 2013 by RuleBritannia Quote Link to comment https://forums.phpfreaks.com/topic/284820-why-is-doing-this-bad/#findComment-1462621 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.