Jump to content


  • Posts

  • Joined

  • Last visited

  • Days Won


Everything posted by gizmola

  1. You have to follow the phpinteliphense instructions and disable the builtin plugin.
  2. Those are not paths under windows. Under windows a path looks something like: C:\Program Files\php-8.1.2-Win32-vs16-x64 A Path to an actual file will be C:\Program Files\php-8.1.2-Win32-vs16-x64\php.exe 1st things 1st! You are using the Inteliphense plugin. If you navigate to the instructions it tells you to disable the builtin php Language Features extension. That setting points to a local cli php for linting. Inteliphense doesn't use that, so it doesn't matter. Disable the builtin and the message will go away. Based on what you've said you installed Laragon. Which version did you install? There is a full version and a portable version. There are really 2 forms of PHP. PHP in a webserver, that is handled for you by your Laragon install and the php CLI program that you would run in a command,cmd or powershell, and that I guess vscode wants a path to. You don't really need this to write code. With that said, most likely the path to your php is this: C:\laragon\bin\php\php-7.4.19-Win32-vc15-x64\php.exe Some things to understand: You don't need vscode integration to use it for PHP development. This is especially true if you're developing a web app. The php files just need to be in the right place so the webserver can process them. Laragon makes this structure for you: c:/laragon/www You can see this in the laragon app by clicking on the little gear, and it will be listed as the webroot. For your project(s) make a directory with Vscode inside that folder. Name it whatever you want but I would suggest not using spaces or non-ascii letters in your directory names, although you can. use Vscode's new directory button or menu choice to make your project folder inside c:/laragon/www. For this example, assume your folder is named "test" Once you have made this folder, open it as the project folder in Vscode Create a new folder named public Usually you want your webroot to be a directory beneath your project folder. There are a few different conventions, but /public is a common one. Create a new index.php file that just has this in it <?php phpinfo(); Navigate to it with your browser specifying the hostname of "localhost". If you get the php info page, then everything is working and you can now add/edit through vscode and should see your changes reflected in your browser. xdebug is hard to get working for many people For web development, again, in order for VSCode to be able to debug and make the connection between source files on your workstation and the programs running within the browser, you have to have everything configured perfectly or it won't work. You need a strong understanding of networking concepts and be able to configure the xdebug.ini appropriately for your system the xdebug extension has to be available, configure to work in your php environment, and have the right .ini settings For vscode you also need an xdebug plugin and the right settings You don't need xdebug to get started with php development. There are many other ways to debug your problems without an integrated debugger, even though it is a really nice tool to have for you in some situations. I rarely have felt like I really needed xdebug for day to day php development
  3. Welcome to PHPF! Please use the <> button to paste in code in the future. I editted your original post to do that for you this time. Your code is using several namespaced classes, but it is missing any statements that might require or include or autoload those classes. The names are very generic, so it's hard to know for sure what they might be a part of. They are not soap specific, as it is just using a generic http request class to send a request that has a soap document embedded in it. You would expect to receive a response that had a soap document inside of it, if it actually worked. My advice to you would be to use one of the many http libraries and just replace those calls with the ones from the library. You will need to have composer installed on your workstation, and hopefully you'll be able to figure out how to use it to install the http client and make a couple small changes to replace the missing libraries. My suggestion would be to use Guzzle, mainly because it is the best known/longstanding PHP library of its type. First off make sure you have composer installed (globally) on your machine. In other words, follow the instructions to install it so it can be used anywhere rather than just installing it in your project directory. Make yourself a new subdirectory. Open a terminal and cd to that directory. Then run this: composer require guzzlehttp/guzzle You probably need a github account, and you may have to create a github personal access token and install it in composer. Try to do the composer require without installing the token, but set it if you get any errors. If you do need the token, make one for 90 days. The default settings are readonly, and those are fine for what you need, which is just to be able to have composer get any component libraries you might want to use. In Github, when you create a token, it will show it to you and you can copy it to your clipboard. Then you would run this command in the terminal: composer config --global --auth github-oauth.github.com token_pasted_here At that point you should have no issues with the composer require command. It will download Guzzle libs into a vendor directory, create a composer.json file for your project, and also create an autoloader you will include. At this point, you can take the code you were provided, and make a new version of it in the root of your project directory. I named this file soaprequest.php, but the file name doesn't matter. I went ahead and ported your code to a guzzle version. You will need to change the specific url and any token information required, as when I ran it as a test I got a 404 response for the url, so I couldn't probe further. <?php // soaprequest.php require("vendor/autoload.php"); $client = new GuzzleHttp\Client([ 'base_uri' => 'https://divaltosainteroseline.coaxis.com/WebServiceDiva', 'timeout' => 5.0, 'headers' => ['accept-encoding' => 'gzip', 'content-type' => 'text/xml'] ]); $body = '<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <WebServiceDiva xmlns="http://www.Divalto.fr/WebService/"> <action>&lt;action&gt;WP_CREATECLI</action> <param> {licence:"XXXXX=",client: {"dos":"2","nom":"Alex Xela","adr1":"53 Bd Carnot","adr2":"","adr3":"","adr4":"","cpostal":"06400","vil":"Cannes","tel":"053837979","email":"user1@devtest.com","siret":"","naf":"","regcod":"CB","tvatie":"0","catclicod":"","tacod":"","tarcod":"","blmod":"DPD","texcod1":"","texcod2":"","texcod3":"","texcod4":"","tvano":"","visa":"2"},adresse: {"nom":"Alex Xela","adr1":"53 Bd Carnot","adr2":"","adr3":"","adr4":"","cpostal":"06400","ville":"","tel":"053837979","email":"user1@devtest.com","livprincipale":"2","facprincipale":""},contact: {"contact":"Customer","nom":"Alex Xela","prenom":"","tit":"","lib":"","tel":"","telgsm":"","fax":"","email":"user1@devtest.com","servcod":"","fctcod":""},banque: {"ribcod":"","ribdo":"","iban1":"","iban2":"","iban3":""}} </param> </WebServiceDiva> </soap:Body> </soap:Envelope>'; try { $response = $client->request('POST', '/WebServiceDiva.asmx', ['body' => $body]); echo "Successful request" . PHP_EOL; $responseBody = $response->getBody(); echo $responseBody; } catch (ClientException $e) { echo Psr7\Message::toString($e->getRequest()); echo Psr7\Message::toString($e->getResponse()); } Again from the terminal, you will run this in the root directory of your project: php -f soaprequest.php It will output any errors or the response from the soap server to the screen in the terminal. If you actually get a response, then you might want to load that data into an object using simplexml or possibly use a soap library, but the code you started with did none of those things.
  4. There are a few different ways to do this, but all of them have a significant learning curve. You really need to understand HTTP, and all the basics of HTML structure, forms, downloads etc. The first path would be to use a Functional testing tool. One long standing open source tool I can point you to would be Selenium, and in particular Selenium IDE. What you do with this tool is record your interaction using their browser extension tool, and then use that script to perform your job afterwards. I'm not a QA automation expert, but this is the basic idea behind how companies put together testing for their websites. I included a short introduction video to give you an idea. There are some additional details you would need, that are probably OS dependent, as to how you would schedule and invoke the selenium test. PHP has tooling that will let you run selenium tests via PHP scripting. The 2nd path would be to use an HTTP client library. Basically, you write PHP code that simulates a web client session for you. Again, these tools are often used for QA automated testing, but there are also many other use cases, like serverside integration with outside API's. Curl as you mentioned, is sometimes an enabling technology in these client libraries, and you certainly could write curl code directly using the curl library, but the client libraries do tend to be easier to work with, and offer classes that hide complexity. There are numerous client libraries you could look at but I'll provide 3 for your consideration: Symfony HTTP Client Guzzle 7 Buzz I'm a big fan of the Symfony components, as is a lot of the PHP developer community. Guzzle is probably the most used Client library, and has excellent documentaion. Buzz is perhaps a little more terse and simpler. It was created by a well known symfony contributor. I pointed you to the github project. To get a feel for it, navigate to the docs folder in github, and there you will find the documentation. Some videos that might help: Guzzle walk through based on an article. This guy wrote an article, and on his windows machine walks through the article and demonstrates the things in the article. There is no actual voice over narrative, so it's just watching what he's doing, but that might be of help to you especially if you are on windows. He uses VSCode which is a good choice if you're new to modern PHP development. Gary Clarke has a lot of really good PHP development videos. He walks through using the Symfony HTTP client in this series. The one thing you have to understand is that he is a proponent of TDD (Test Driven Development) where you write unit tests first, and then develop your code to meet the criteria of the tests. It's a really interesting way of developing code that has a lot of proponents, but there are more moving parts to it. I still think it's an interesting watch that you might learn some things from:
  5. How about the official Docs: https://code.visualstudio.com/docs Once setup ok, go through these short "microsoft recommended" videos. https://code.visualstudio.com/docs/getstarted/introvideos They are all pretty short and go over the basics. I reviewed enough of this video tutorial to know that it is clear, concise and well presented, and doesn't suffer from the issues you described in some previous videos you might have seen previously. You might consider giving it a shot. It was made by a guy who worked on the official Python extension at Microsoft, so he really knows the editor very well.
  6. Please use code tags <>. Basically you need to make up your mind as to what this script is intended to do: Return the data for an image, so that it can be referenced as the source in an image tag. Return Some html The problem you have right now is that you are setting the header, as if you wanted to return image data header ('Content-Type: image/png'); Then you return some html, which includes an img tag and an embedded base64 image. echo '<img src="data:image;base64, ' .$im. '" style="width:5in;height:5in;">'; So, if you want to return the data and reference the script in an <img src="..."> tag, then you would continue to use the header (as long as your image is actually going to be a .png) and just return the image data. Often this is what people want to do, when creating an image on the fly in the server. In your case, you started with some base64 data, that is perhaps an image. If so, then all your existing code would need is this // header ('Content-Type: image/png'); --NO! You are returning HTML not image data $b64 = "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; echo '<img src="data:image/png;base64, ' . $b64 . '" style="width:5in;height:5in;">'; Amongst the several confusing mistakes you are making currently, you read data into a GD OBJECT. Then you try and return that object in a place where you need base64 encoded data. If you are going to use a function, you need to actually take 30 seconds and look up the function and at minimum: Check the number and types of the parameters Check what the function returns I'm going to assume here that there is some reason you want to read image data into GD. In this case, you commented out all the code that you would need to actually have this function. At minimum it would be more like this: // header ('Content-Type: image/png'); --NO! You are returning HTML not image data $b64 = "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; $bin = base64_decode($b64); // Load GD resource from binary data $im = imageCreateFromString($bin); if (!$im) { die('Base64 value is not a valid image'); } echo '<img src="data:image/png;base64, ' . base64_encode(imagepng($im)) . '" style="width:5in;height:5in;">'; This is unsophisticated code, because it has the baked in assumption that your original source is the base64 encoded version of a .png image.
  7. $data is an array with one element that is an array. That array has a lot of elements including the one you say you want. So try: <?php foreach ($data[0]['lastData'] as $key => $key_value) { echo "key: $key, value: $key_value <br>"; } Once you have figured out which keys you actually want, you should be able to access them more directly. So for example: echo "<p>Temperature (F): {$data[0]['lastData']['tempinf']}</p>"; echo "<p>Wind (mph): {$data[0]['lastData']['windspeedmph']}</p>"; I don't see a min/max temp value in the data you provided. Aside from 'lastData', there are several other keys and nested arrays in some cases. For figuring this out in the future, aside from var_dump, print_r is often a useful development/debugging function that can be used as an alternative.
  8. Maybe one of your validations failed, and it set a value in $this->error_array. You check if that's empty, but if it isn't, you just return false, so the value of that array is set to something you don't make that visible. You should probably have a method to return it. class Account { // current code public function getValidationErrors() { return $this->error_array; } } And then your code could be something like: if($account->UpdateDetails($firstName,$lastName,$email,$userLoggedin)){ //Sucess echo "update"; } else { ///failure echo "No update"; echo '<pre>' . explode(PHP_EOL, $account->getValidationErrors()) . '</pre>'; }
  9. Being able to pass extra/unlabeled parameters was a feature you could make use of using func_get_args. PHP version 5.6 added variable parameter lists(variadic) and the "..." operator to formalize this and make it easier to use. So now you can have code like this: function giftBasket($occasion, ...$contents) { echo "You purchased the $occasion basket that contains " . implode(', ', $contents) . '.' . PHP_EOL; } giftBasket('Holiday', 'Salmon', 'Crackers', 'Candy'); giftBasket('Birthday', 'Balloons', 'Cupcakes'); giftBasket('Valentine', 'Chocolates'); The "..." operator is called the Spread operator or spread syntax in javascript. Some languages like Ruby call it the "splat" operator, although most use the asterisk. It works to essentially explode an array into individual variables that can then be passed as parameters. function bio($name, $city, $state) { echo "$name is from $city, $state" . PHP_EOL; } $players[] = array('Bob', 'Phoenix', 'AZ'); $players[] = array('Samantha', 'Boise', 'ID'); $players[] = array('Charlie', 'New Haven', 'CT'); foreach ($players as $player) { bio(...$player); } The PHP group has been pretty busy adding features like this to the language.
  10. Hope your recuperation goes well. We'll be here when you are feeling better.
  11. Not sure what you mean by "not getting"? One thing that's important to understand is that url's involve "web space", not filesystem space on a workstation. If you use FILE|OPEN with your browser, the browser goes into a local mode where it will parse html etc, and will work with local files and paths but rarely do I see this use case. Since I'm not sure what the purpose of your current scripts are, it's hard to say, but a URL is not a filesystem path. Is this code meant to be accessed via a browser? Then your URL's need to be within webspace, and not reflecting a file system path. Just for clarity, even with what you have, it's odd, and you introduce a space where you probably need a directory separator. If you are using interpolation, then use it. Maybe? echo "<a href='$latest_dir/$latest_file'><button>continue</button></a><br>"; With that said, this should only produce a url with a local filesystem path, and only usable by a browser in local mode, which is almost never what you want to be using PHP for.
  12. I interpreted the question specifically to be someone with subdomains. So for example. www.mysite.com store.mysite.com It's pretty common to have setups like this, where you might want or need a session to be accessible to both subdomains. Since the main mechanism used to pass the session id is a cookie, restrictions on cookies are relevant. The default unless you change it, is to have the PHP session cookie set for the subdomain rather than the domain. The setup information provided was ostensibly code to change default session handling so that the session cookie is configured for all subdomains (.mysite.com) which would enable the reading and writing of session values by any subdomains of mysite.com.
  13. 100% what requinix said. Unless there is some important reason you need to try and differentiate between "mobile" devices and whatever other client might be consuming your site, all that matters is that your site is responsive. It's probably just as important that your site looks good on large screens rather than designing to a one-size fits all mentality. min-width and max-width can be helpful. Some of that is using newer layout features like flexbox or grid, and avoiding fix sizes. Use em and rem for typography. learn about attributes relative to the viewport like vw, vh, vmin & vmax. learn about min-width and max-width style images with width: 100% so they expand and contract. learn and use flexbox and/or grid for your layout learn media queries and how to use them A basic example would be a nav bar styled using flexbox. With flexbox you would have a container/parent element like "nav" <nav> <ul> <li><a href="#">Home</a></li> <li><a href="#">About</a></li> <li><a href="#">Contact</a></li> </ul> </nav> CSS would be something like this: nav ul { list-style: none; padding: 0; font-size: 3rem; display: flex; justify-content: center; } nav li { margin-left: 2em; } nav a { text-decoration: none; color: #707070; font-weight: 700; padding: .25em 0; } nav a:hover, nav a:focus { color: lightblue; } @media (max-width: 650px) { nav ul { flex-direction: column; font-size: 1rem; } /* have to reset the margin for centered menu items */ nav li { margin: .5em 0; } } You can play with the max-width value here, but this illustrates a pretty standard technique of having a desktop layout that you then modify using one or more media queries, to change your desktop styles to something more mobile friendly. In this example, I have the nav with a default "row" orientation. The li items are centered and layout in a row across the screen. When the width of the browser is shrunk below the threshold of 650px wide, I change the "nav ul" flex-direction to "column" which causes the li items in the nav to be in a column. I also reduce the font-size and change the margin property so the text is no longer centered. This is a very simple example, but it should give you a jumpstart into what "responsive" design offers.
  14. No worries my friend, your passion and desire to produce is very evident, and speaking for most of the regulars here, we invest time here to try and help people like yourself who are working hard at building up their expertise.
  15. I am doing the same as @requinix. I also paid the $15 fee to get the registered/upgraded capabilities of Inteliphense. Just make sure you follow the instructions for the use of Inteliphense. Very worth it. Key thing to do after you install intelliphense: VSCode's built in Emmet support is a killer feature when you are writing a lot of html.
  16. First off, does it matter whether or not a column is null or ''. The answer to that very much will dictate what you might need to do here. The difference between NULL and an empty string with mysql is an annoyance. Short answer: If you need to query for values in a column that are either NULL or not NULL, then your syntax needs to be different. The standard equality '=' check doesn't work. For example, looking for NULL values in a name column: SELECT * FROM test WHERE name = NULL; Will be empty. You have to use: SELECT * FROM test WHERE name IS NULL; However, if the value is an empty string: SELECT * FROM test WHERE name = '' Will work. In order to update a column to NULL you need to use the exact syntax of UPDATE asset set sale_stamp = null WHERE id = '17' You mention the "generated SQL". You don't specify what is generating the code. With that said, I would probably first try to see if setting the value of $sale_stamp to PHP null works. $sale_stamp = empty($_POST['sale_stamp']) ? null : $_POST['sale_stamp'];
  17. Hi Leon, Some problems with your markup: Block elements already have a box around them. You don't want to nest an h1 inside a p for example: <p><h1 class="headline">Et godt eksempel på at det fungerer, er at IANA har godkjent særnorske tegn i domenenavn. Om det er noe som har slått til (blitt en suksess) er ett annet spørsmål. Du kan jo forsøke selv og se om det er noen norske butikker og firmaer som har registrert sitt firmanavn, for eksempel. www.elkjøp.no .</h1></p> Use something like this instead: <article class="article"> <h1>Title</h1> <p>Article text here ........ </p> </article> Hey let me suggest to you a methodology for css naming and specificity I really like: BEM. CSS can easily have specificity issues, and can also make your page structure brittle. One thing you are doing that is not great, is to use div.class in your css. That's just a bad idea. Rules of thumb are these: Never use ID's for selectors Don't select by tags for any complex selectors Give everything you want to style its own class So with BEM you want to step back and look at your "blocks" What are they from a structural level? From what I can see your outline should have started with something like this: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Site Title</title> <link rel="stylesheet" href="style.css"> </head> <body class="body"> <header class="header"> <!-- Logo Top Menu nested here--> </header> <div class="body__container"> <section class="menu"> <!-- Menu block here --> </section> <main class="main"> <article class="main__article main__article--primary"> <h1 class="main__headline">Hva ligger bakenfor?</h1> <p class="main__content">Organisasjoner som setter standarder for drift, bruk og utvikling av internett.</p> </article> <article class="main__article"> <h1 class="main__headline">...</h1> <p class="main__content">...</p> </article> </main> </div> <footer class="footer">Footer Stuff Nested here</footer> </body> </html> I would take a step back from what you are doing and make sure you have a clean block structure. With BEM, you make a class for each semantic block. You should remove all those div.class selectors. Make a css class for every block, element and element--modifier you see, and add any additional ones you need for menus etc. .body { } .body__container { } .menu { } .menu__button { } .menu__title { } .menu__text { } .menu__link { } etc. For the menu, usually people will use either a ul with nested li items, or a bunch of buttons inside a section. <section class="menu"> <div class="menu__title">Naviger</div> <a class="menu__link" href="index.php" title="Tilbake til Start"> <button class="menu__button"> <span class="menu__text">Hjem</span> </button> </a> <!-- other menu items the same --> </section>
  18. There are many ways to accomplish this. What approach have you attempted so far? HTML tables Flexbox Grid One fundamental technique for procedural programming, when looping through a set of data, is to utilize the modulus operator. By checking the remainder of division by the number of items you want per row, you can determine whether or not to start a new line, or whether a new line was just started. Consider this code that has a simulated result set of rows: <?php define('PER_ROW', 3); $resultset[] = array('id' => 3, 'name' => 'Bob'); $resultset[] = array('id' => 5, 'name' => 'Mark'); $resultset[] = array('id' => 9, 'name' => 'Sam'); $resultset[] = array('id' => 10, 'name' => 'Linda'); $resultset[] = array('id' => 11, 'name' => 'Amy'); $resultset[] = array('id' => 75, 'name' => 'John'); $resultset[] = array('id' => 20, 'name' => 'Aaron'); $resultset[] = array('id' => 19, 'name' => 'Ringo'); $resultset[] = array('id' => 2, 'name' => 'Paul'); $resultset[] = array('id' => 99, 'name' => 'George'); foreach ($resultset as $key => $row) { $key++; if ($key % PER_ROW === 1) { // First item in row echo "| "; } echo "{$row['id']}: {$row['name']} | "; if ($key % PER_ROW === 0) { // Last item in row echo PHP_EOL; } } echo PHP_EOL; You can play with this example here: https://3v4l.org/lD83M Changing the PER_ROW constant to another number like 4 for example, should help you see how this common technique works.
  19. One reason I keep coming back to the forum, is that there are times when someone uses some syntax or a function or technique I'm not familiar with or wouldn't have thought to use. Seeing what other people offer as a solution to questions is a nice diversion and helps keep the learning process fresh.
  20. This is the expected behavior. YOu have declared that the content_box has a width of 950px. So at the point that it can not fit side by side with the menu_box div. I'm not sure what you are going for, because the typical way to handle responsiveness down to mobile sizes is to use a media query and do something to hide the menu, perhaps with the display of a hamburger widget. If you want to keep these divs side by side, then I would suggest you use flexbox instead. With Flexbox, you need a parent container for the columns you want to orientate. There are many layout options possible with flexbox, so I leave that to you, but you can see from this demo that this performs more inline with your expectations. Rather than use a fixed width for your content div, I used 80%, but you can also see how flexbox handles expanding or shrinking. Test Markup <div class="content"> <div class="menu_box"> <ul> <li>Home</li> <li>Item1</li> <li>Item2</li> </ul> </div> <div class="content_box"> <h1>Content Box</h1> </div> </div> CSS div.content { display: flex; } div.menu_box { color: #008833; margin-top: 0px; margin-left: 10px; width: 165px; /*max-height; 100px;*/ height: 300px; /*border: solid 1px;*/ /*border-color: #ffcc99;*/ /*border-radius: 5px;*/ background: gray; } div.content_box { margin-left: auto; margin-right: auto; margin-top: 5px; width: 80%; max-height: 100%; margin: auto; border: solid 1px; border-color: #ffcc99; border-radius: 5px; background: blue; } Codepen based on your original code, with some background colors to see something: https://codepen.io/gizmola/pen/xxXMwLP
  21. You will need to develop techniques within your search engine to determine if a site is adult and not include that in your results.
  22. I like @ginerjm's advice a lot. One thing I would add to it is that you should use empty() to check for a variable that may or may not be set. if (empty($_GET['id'])) $errmsg .= 'Missing id value<br>'; else
  23. I agree with everything @mac_gyverwrote. Please use the "<>" button to paste in your code in the future. As to the error, it is telling you that you are trying to reference a key in an array, but the variable isn't an array at all, it is the null value. Since it is the result of the fetch() that pretty much tells you the fetch failed.
  24. print_r is a debugging tool, so you can evaluate the contents of variables on the path to your final solution. Array keys require either a numeric index, or a string key. If it's a string key, you need to put quotes around the key: $cert = openssl_x509_parse($_SERVER['SSL_CLIENT_CERT']); echo $cert['extensions']['subjectAltName'];
  25. Hi Arend. I Don't know how long ago you did any PHP but much has changed. The biggest change is that any new project should involve the use of the Composer. https://getcomposer.org/ The language has a lot of new syntax and improvements, and it's also faster than it has ever been. PHP has 2 of the best MVC frameworks in the web development world in Symfony and Laravel. Most professional PHP developers are using phpStorm as their editor. With that said, for beginners and people who are coding as a hobby, I personally recommend Visual Studio Code with the Intelephense plugin. It's free, but there's an enhanced version license you can get for $15 that includes additional highly valuable features that make VSCode better for PHP development. It's very worth the small investment. You should learn about git and start using it. If you don't already have one make a github account. Here's a solid tutorial on the git basics you need to know, that I've reviewed and can recommend as providing a solid foundational understanding in 30 minutes.
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.