It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 10 years ago.
I am writing a website in PHP where the aim is to allow the users to enter some monthly data, this is stored in MySQL, and at any point a user can view statistics to do with there data. I have all the basics done, however my code is completely unreadable, it is a mass of if statements, with no obvious structure, even with comments it's fairly opaque. How should I structure my code elegantly, and in what way should I utilise the OOP features of PHP.
Well.. I can only tell you what I generally do, not if it's the 'best' way or if there are more transparent workflows... just that it works for me very well ;)
First thing, and most important:
get rid of ALL non-php code in your php, for html display use templates either make a template system yourself or get one off the shelf (smarty for example).
Try to identify structures you use very often (like sql conenction and access) and put those into classfiles (you can easily change your sql system that way if you need to, by just editing ONE file, not countless others too)
Now find duplicate codeflow (mostly identical if-else-structures and so on)
and create functions for them to replace the original code with said function.
maybe even create more classes for functions that belong to a certain task.
So you end up with one class for the db, one for user information and editing, one for adding, editing and removing informations, and one for html output (and maybe even more)
Now set up your file system accordingly (put class files into a subfolder, templates in another, the same for images, javascripts etc.pp)
Next: Find all "settings"
All predefined values that may need to be changed, and put those into a settingsfile (init.php for example) maybe even as a class construct.
And as the last part, clean up all the mess inside single phps you cannot reduce further.
First: all the setup, include the files(classes) you need setup define the constants you will need for this script etc.
Second: all the script functions either in alphabetical or logical order.
and last the codeflow.
And that's it (a lot of work...) But you'll end up with a structure that I find easy to maintain. If you need to edit a setting, than it is in the init.php for sure, you want to change some db-structures or have changed your database, then you'll just need to update your sql.php and the like.
If someone else has to maintain the code too, you'll most likely will have to comment each file properly as well, personally I use comments for myself as well, since I have some scripts that needed to be changed after five or more years, that way I still know what goes where ;)
Good luck!
I recommend reading up on code cohesion and loose coupling, those are important concepts which you need to familiarize yourself with if you're to build great, maintainable applications.
You should also catch-up on design patterns and common usage cases, if not all of them - atleast the big ones, which are IMO: singletons, factories, DI and IoC (you see those across the board).
Once you've got the theoratical thinking going, you should start writing your code in an indsutry-standard type of way, which for PHP is MVC - you can use one framework, whichever really doesn't matter much, once you've learnt one framework - reading alot of other projects code will be very easy because it usually follows the same pattern with some written better than others.
Good Luck!
You are in need of a framework to structure your code. Luckily for you, this problem has been solved by many. CodeIgniter, Cake, Zend, Kohana, Symfony, Yii, Slim, Laravel, Fuel, the list goes on.
I highly recommend you look into CodeIgniter as your first PHP framework. The documentation and community are both second-to-none.
You may use some kind of PHP framework like Yii, Zend, Symfony or Kohana. MVC separation will be your good friend.
Related
It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 10 years ago.
Once I've read in the "Clean Code" book that comments shouldn't be written because they mess up the code.
On the second hand however, "kohana" code (as one of many) contains extensive documentations and comments before almost every line of code.
I'm creating the project which will be used by user-programmers in the future...how should I write comments then?
To make this more clear - should I:
Write documentation before each class ?
Write documentation before each method ?
Write #param, #return... for each method ?
Write comments for almost every line of code to make it more clear ?
You should:
Write documentation before each class
Write documentation before each method
Write #param, #return... for each public method
Comments on every line of code aren't too necessary, but I recommend them on lines of code which would otherwise be unclear or obscure.
I write comments/documentation in two major cases:
When something the program does isn't immediately obvious. Even if it looks obvious now, it won't be in 6 months, or to another guy trying to maintain your work.
When the variable/argument/property types aren't clear. That's when I add a docblock.
Most (all) decent IDEs have mechanisms for collapsing and even hiding comments. Don't give them up because a book told you so, or because you think it's "messy".
Messy is a subjective term. I'd argue writing one comment line can save 10 hours of headache to future you.
To be honest, I would consider future readers. Will they benefit from the comments? In my own case, I have only regretted the comments that I failed to write and rarely the unnecessary comments that I did. Many times I've thought "there's no way I'll forget this"... and did.
As an alternative, you can also maintain a separate copy of the code with full commenting, and a release version where you remove most/all comments.
Whatever book you read that said comments shouldn't be written, you should immediately throw away and forget about forever. I don't care if you are the only person who will ever be working with the code, you should still document it.
To me, if you are working on code that will be used by other developers, I would try to stick with the PHPDoc (JavaDoc) style of documentation, which means you document every class, method, property, etc. as thoroughly as possible. One benefit this gives is that a lot of IDE's will actually use this information for code completion, making your application even easier to work with.
Now within code blocks themselves, I don't think you need to comment every line (especially lines where it is readily apparent what you are doing), but it is useful to comment different sections of the code, different logic branches, etc.
Also one non-comment thing I would also suggest, is using variable names that are meaningful to their purpose (with the exception of simple counters). Oftentimes people get cute and want to use 3-4 letter variable names, because of some misplaced opinion that it will same them loads of time in typing, or make their code shorter. If you need a long name like product_catalog_iterator to describe a class, to me that is better than prodcatit or similar.
I'm a believer in not writing comments. Instead writing code that is self commenting. What I mean by that is your functions and variables describe what they do. For example you could write it two ways:
function foo1($a, $b, $c){
return md5($a . $b . $c);
}
or you could write
function encryption($pepper, $content, $salt){
return md5($pepper . $content . $salt);
}
In this example the first one you have no idea what it's doing, but the 2nd, one you know exactly what it's doing. The only time I feel comments are needed is after you write really hacky code that took you a long time to figure out how to do it and isn't very clear what it is doing. This however should be far and in between.
The reason documentation isn't a good idea, is because what generally happens is you write great comments for when the function is first created and then after bug fixes and maintenance. The comments were never updated and now that comments are saying something the function doesn't do and offers confusion instead of help.
It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 11 years ago.
I'm new to cakephp and still learning my way through php in general. To learn I'm trying to build an app which allows the following:
- A user can sign up (using the basic Auth component)
- A signed up user can create a 'campaign', ie fill in a form which will end-up as a page on my website containing details of things the user is trying to achieve. As well as that there will be a 'story' field in the form for the user to explain the reason they are trying to achieve whatever it is they are doing.
Users will have different reasons for creating their campaign, ie new years resolution/wife nagged you into doing it/need to make more money etc etc...
To help users along what I'd like is to have some default stories written and via a radio button users can select their default template to edit. In other words, if they select the 'new years resolution' template a pre-written story will appear in the text box for the story field which they can edit to their preference before submitting.
As I said, Im new to cakephp but have bought all the books and read the manual a couple of times, but since I'm also a bit green with php too I'm struggling a bit. But whats the best way to go about doing the above?
If someone could give me a bit of a break down so I can go off and google the correct things then it would sure make this learning curve a whole lot less daunting.
thanks in advance
pete
ireland
[Sorry to be so blunt but] It's pretty tough to answer this since you don't really have a specific problem but a general problem: you don't know the tools you want to work with.
Again, I don't mean you no harm.
For PHP in general, I would probably suggest to keep http://docs.php.net open in your browser at any time. PHP has one of the best (or maybe the best) language reference and manual. It probably also doesn't hurt to buy a book - IMHO, one from O'Reilly is usually a good fit.
As for CakePHP, I'd recommend starting here: http://cakephp.org/#learn
What you need to do is learn the framework and then go from there. Learn and adapt. There's no other way. What you described is of course not specifically part of any of the tutorials or screencast, but they teach you the skills necessary to achieve your own goals.
It seems like I am "wearing the same exact shoes" as yourself. I have a huge project to work with and no CakePHP knowledge. I tried to start with a plugin like many have suggested, but quickly got lost. Now a couple of months into learning CakePHP, this is what I would suggest you do:
Read the manual entirely (I downloaded this COPY and ordered it only as a manual)
Place sticky markers on the pages and sections you feel you need to reference back
Use a notebook to create your database structure as detailed as possible and use CAKEAPP to make them all come together. Use as much time as you need since the Database is the most important section of your app. CakeAPP allows you to set your app relantionships as well. Pretty neat!
Download the SQL code from CAKEAPP and dump it into your MySQL Database
Use Cake Bake to generate all your Models and Controllers (Change them later if necessary)
Create your main site layout (default.ctp)
Manually create all your other Views.
At this stage, DO NOT look at plugins. Plugins will make you lazy and prevent you from learning CakePHP. After you got your main application structure going, you can then look at plugins to beef it up. Looking at plugins this early in your game will only slow you down. Also, look at tutorials online and Q&A like STACKOVERFLOW's. Most importantly, read the Manual
BTW, I am still working on my Database to make sure, from the get go everything is as close to what I need as possible.
It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 12 years ago.
as web developer using PHP/JS/CSS for years , i suffer from repeat myself over and over and over and over , even if i use a PHP framework , i feel the same thing every time, i start to build new feature , so every time i started new thing i feel the 'Déjà vu' ( i write it before ) , and i rewrite many things from scratch despite i write something same before , if i use previous written code , i may take more time to reuse it , i love programming and web development , but by this way i will lose this :( ...
Where the problem ? in language , my way to built software or what ?
if i use previous written code , i may take more time to reuse it
This, I believe, is your real problem: you're writing way too much quick-and-dirty code and are suffering from the resulting techincal debt. The problem is, what is quick in the short term can lead to being very slow in the long term.
If I may offer a non-technical comparison, consider a Ferrari and a cargo ship. When delivering just one letter, it seems obvious that the Ferrari would be much faster not to mention much more convenient compared to using a cargo ship. Just loading the ship before leaving the docks can take hours. By which time the Ferrari would have already completed the delivery. But when you have to deliver a hundred tons of mail, the cargo ship would complete the delivery while the Ferrari would still be busy speeding back and forth delivering each letter.
It's the same in your case. When developing just a single web site, it will always seem obvious that you should write the least amount of the simplest possible code to get the job done quickly. And if your whole career is devoted to just one web site I would even say that that's the right way to do it. It is, after all, the essential spirit of Agile methods. But if your job is to develop websites (plural) then this approach will start to become slower with each new site. Just like how the Ferrari is not ideal for delivering a hundred tons of anything.
One real world example is 37signals. When their business model requires that they should be able to quickly develop and deploy sites as necessary, instead of just diving in and develop their first site in a quick-and-dirty way, they took a step back and developed Ruby on Rails instead.
I'm not saying that you should go ahead and start your own framework, re-inventing the wheel is exactly what you want to avoid at this point. What I'm suggesting is to separate the functionality you're developing from the web related code. In other words, when writing new code write it as a library. Yes, it's a bit more involved writing code in two or more files compared to inlining the functionality directly in the PHP page. But in the end your next web site would be easier/quicker to implement.
I always, as a matter of habbit, create a lib directory in a project's base directory whenever I start a new project. I then force myself to write all code even remotely reusable as separate modules in this directory. These days I find that, more often than not, I'd simply copy (or more commonly make a symlink) of files I need to the lib directory instead of writing the needed code.
The problem is that when PHP started, every tutorial, every demo and all code was made in a very structured way, because PHP descended from the C/C++ family. Many developers took this problem and have carried it, and it was visible that we couldn't keep this.
Now, we have PHP 5.3.3 available, we have namespaces, objects, classes, interfaces and all of this. Many of the things that helpt making bad code like magic quotes and register globals are now deprecated. PHP is evolving into the OO world, it took long enough, but is happening. So if you want to start again to "relearn" PHP I would suggest getting your hands on some frameworks like:
symfony, joomla, propel, doctrine
learn about mvc and design patterns applied to PHP and you will see how you'll start making good OO code, and the deja-vus might stop before you knwo it.!
Hope I can help
David
This is exactly why a framework is the best way to go. It takes out the mundane parts of code (the stuff you always have to write over and over like DB connections).
I would suggest picking a good framework (I use CakePHP, but there are others like Symphony, Codeignitor, Zend, etc.), and as you build various components, you can reuse them in other projects. It will reduce the time it takes to write all future projects.
It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 12 years ago.
When a Web framework ( like django, ruby on rails, zend, etc ) isn't convenient to use ?
And so... When a Web programming language ( like PHP, Asp, Python, etc ) is better than a Web Framework ?
I like the wikipedia description:
The framework aims to alleviate the
overhead associated with common
activities performed in Web
development. For example, many
frameworks provide libraries for
database access, templating frameworks
and session management...
Basically if you don't need all of the above, you don't need a framework.
You don't need frameworks when you don't plan to use their features.
The difference is, in my opinion, the simpleness of what you are trying to build.
Are you trying to make a difficult, complicated web app, or are you making a simple script that performs a trivial task? In the first case you absolutely need a framework, in the second case.. don't even bother.
The rule that I have is that if whatever I'm building is only going to be a single page, I'll usually do it in just PHP. Whenever I need more than one page, I go with a framework (Symfony), because that usually means that I'm going to want things like routing and proper dispatching of requests.
This does however depend a lot on the language. In languages like PHP, the time needed to set up a project to use an MVC framework may be a lot more than just solving the problem. Other languages may very well be designed around using an MVC framework, and has a very low setup cost for that.
A web framework is supposed to provide means to handle certain kind of interaction. If you have site with no interaction or no "adaptation", you don't need either framework or programming language, you simply write HTML files and publish your files.
As you start to add features for the back-end (like publishing more plain pages) or in the front end (like sorting a list when the user clicks "order by") you start getting into frameworks/programming languages.
Basic interaction was handled with CGI - you write an script which responds with a string to a few parameters passed via a form. Then you have database access.
In my experience, if you need simple features AND want your website to be suitable for growth without resorting to rewriting it from scratch, you should start from a web framework like Django. You can do simple things quite easily in Django (granted - it is not trivial) and add very complex behavior with small, incremental steps.
When you have to build a very complex site, and the functionality is already exists in a CMS (eg Drupal, it has amazingly lot contrib for everything).
I'm at that stage where, because I spent so much time learning a framework recently, even if I do a one page "website", I will still use one, need to get my ROI up :p
It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 12 years ago.
I'm working on my first professional project. The fact is that I don't know which are the best tools to produce something serious (I'm talking about web-develop through PHP):
Are template engine like Smarty mandatory? Which one is "the best" (the most used, complete, documentated)
At the moment I'm developing on Notepad++ (mostly because I find it useful and complete) is there a better development tool? Or is just a matter of personal taste?
At the moment I'm studying JQuery and deepening my knowledge as regards CSS what other "mandatory" subjects can you suggest me?
This is what I can think of at the moment, have you any other suggestions?
Thank you.
EDIT: As someone made me notice the question is a bit ambiguous. I know the basics (HTTP protocol, Java Script, CSS, HTML, OOP theory and practice etc...). I'm studying computer science at the University (and the project I'm speaking of is my thesis). I need advise on how the "real world" works (outside my basement).
Don't focus on becoming a Professional PHP Programmer. Focus on becoming a professional web developer, and check out the What should a developer know before building a public web site? question.
Saying "I want to become a Professional PHP Programmer" is like saying "I want to be a professional painter" when you actually mean "I want to be a professional artist." Sure, at the end of the day both might paint and get paid for it, but what their customers expect of them is very different ;)
Specifically for PHP I'd recommend:
Learn a good framework. Depending on the size of the project, you can use Zend/Symfony or CodeIgniter/others for small ones. There are tons. I'd stick to Zend/Zymfony for something mid-sized and/or "real world".
In general these frameworks come with a basic template engine or you can plug in other ones like Smarty or Twig. I'd say it improves the code a lot. So, yes to your first question.
Also, notepad++ is amazing, but I recommend using an IDE if you're working on a project and not a simple 2,3 file script. I strongly recommend Netbeans. It has lots of teatures and it's really active. Check it out: http://netbeans.org/features/php/
Since you're coding in PHP, I'd say you get to know the SPL (Standard PHP Library): http://php.net/manual/en/book.spl.php
To sum up:
Strongly recommended to keep code clean and mainteinable.
Yes.Netbeans.
Yes. SPL, and a lot more I can't think of now.
A templating system like Smarty isn't mandatory, since PHP is technically a templating system. However, it's not a very good one. It's clumsy, very easy to make mistakes with, and you frequently end up with an incomprehensible mess.
There are better alternatives than Smarty out there. I'm kind of partial to Twig, myself.
Using a framework is pretty much mandatory these days. Development with a framework is generally much easier and quicker than using raw PHP, once you've got the hang of how it works. Code Igniter's pretty good, although minimal. CakePHP is quite good, although seems very heavyweight at times. Kohana, Symfony, and the Zend Framework are pretty highly regarded as well.
1 - The Smarty engine is very useful and probably the most popular in PHP application development.
2 - I use Aptana studio for PHP development. It's pretty complete and has nice tools coupled with it. It's based on the Eclipse IDE, so it's pretty customizable. The major drawback is that it uses a lot of resources.
3 - I recommend learning development patterns like MVC (Model - View - Controller) to get a good base of how data should be organized.
Also, look up Code Igniter, It's an amazing framework to work with (it uses the MVC pattern). Building something with it is really easy and very easily manageable. If you want simple tutorials, you can check on NetTuts for a serie of tutorials.
Agree with what Pekka is implying, which is that it's important to pick up another lang in addition to PHP. Please. Also, I can't see learning PHP without knowing stuff like Smarty. Notepad++, who cares there, each to his own. jQuery is fine though I might opt for plain vanilla Javascript before getting into a library. Even though jQuery makes things easier it abstracts a lot of stuff and what you really want is those Javascript mechanics.
I would also add a solid knowledge of the HTTP protocol as a must-have that some web devs seem to think is optional. You should know what a hard 404 is, and what content encodings are, and the different flavors of caching disposition, etc, etc, etc.
Above all, have fun!
Most web development includes some degree of database interaction, so good DB skills is always useful.
Basic normalization of tables.
Understanding Transactions
Knowing how to escape your values
before insert/update/etc
write selects with joins how to avoid
nesting database selects within code
loops
differences between database
and PHP dates (and how to work with
them)
etc
My standard recommendation in questions like this, in addition to the excellent suggestions given in the other answers already, is to at least dabble with a strongly typed language like Java, C++, Delphi or C#, with a merciless compiler enforcing discipline - proper declaration of variables, definition of complete class interfaces etc. etc. I love PHP, but it is very permissive and sometimes still shows its templating language roots, and tends to seduce newbies into bad practices. (That said, PHP nowadays is a fine language and it is well possible to write very high-quality software in it.)
However, you say in your update that you do Computer Science at University, so I guess you are already getting your helping of at least one other language, and CS theory, and your focus is indeed which frameworks to use etc.