اذهب إلى المحتوى

سامح أشرف

الأعضاء
  • المساهمات

    2934
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    56

كل منشورات العضو سامح أشرف

  1. خطأ permissions error يعني أنه ليس لديك الصلاحيات لكتابة أو قراءة هذا الملف. حاول تشغيل الكود كمدير run as administrator وذلك عبر البحث عن CMD في قائمة أبدأ start وأضغط على البرنامج بزر الفأرة الأيمن واختر تشغيل كمدير run as administrator ، بعد ذلك حاول تشغيل الكود مرة أخرى.
  2. يوجد أكثر من طريقة للقيام بهذا الأمر، وأسهل طريقة هي إستخدام طريقة الأقواس للوصول إلى التابع، كما يلي: firstUser["getAll"]; // access the method firstUser["getAll"](); // call the method وبالتالي يمكننا إستخدام ما يرجعه التابع methodName مكان النص في المثال السابق: firstUser[methodName()]; // access the method firstUser[methodName()](); // call the method أيضًا توجد طريقة أخرى عبر إستخدام الدالة eval: eval("firstUser." + methodName() + "()"); لكن لا يُفضل إستخدام هذه الطريقة لأنها قد تؤدي إلى وجود ثغرة XSS والتي تسمح للمهاجم بتنفيذ أكواد JavaScript ضارة بالمستخدم بغرض سرقة البيانات أو التخريب بشكل عام.
  3. يوجد خطأ لديك في JavaScript حيث أنك نسيت علامة = بعد كلمة langs مباشرة. حاول أن تقوم بتعديل كود JavaScript وإضافة علامة المساواة بعد كلمة let langs مباشرة وقم بحفظ الملف وأعد تحديث الصفحة في المتصفح وسيعمل الكود بدون مشكلة.
  4. هذا الأمر ليس صحيحًا تمامًا، فتعلم إي إطار عمل يتطلب معرفة جيدة بلغة البرمجة الخاصة بهذا الإطار، على سبيل المثال لكي تتمكن من إستخدام إطار العمل Laravel يجب أن يكون لديك معرفة جيدة بلغة PHP ولن تتمكن من إستخدام إطار العمل إلا إن كانت لديك كل أساسيات لغة البرمجة نفسها. أيضًا إن كنت تهدف لأن تصبح مطور شامل Full-stack Developer فيجب أن تتعلم لغة JavaScript بشكل جيد لأنك سوف تستعملها عند إنشاء واجهة الموقع نفسه أو عند إرسال طلبات Ajax أو عند إستعمال مكتبات معروفة مثل jQuery أو غيرها. أيضًا التفكير في أن العملاء يهتمون بشكل الموقع فقط ليس صحيحًا تمامًا، حيث يوجد الكثير من العملاء الذي يهتمون بكثير من التفاصيل، مثل أداء الموقع Performance وتجاوبه مع كل أحجام الشاشات والمميزات التي يوفرها الموقع في الواجهة الخلفية Backend والواجهة الأمامية Frontend، وعليك أن تهتم بهذا الأمر جيدًا حتى وإن لم يكن العميل على دراية به من الأساس، وهذا الأمر هو ما سوف يجعل العميل يتواصل مع أكثر وقد يطلب منك مشاريع أخرى في المستقبل أو يرشحك لأشخاص أخرين. أنصحك بقراءة كتاب طريقك إلى العمل الحر عبر الإنترنت حيث ستجد فيه الكثير من المعلومات المهمة عن العمل الحر بشكل عام وكيفية التعامل مع العملاء
  5. المدرب يستخدم نظام الويندوز أثناء الشرح في الدورة، ولكن إن أردت تعلم نظام التشغيل Linux تستطيع الإطلاع على العشرات من المقالات التي تشرح Linux بكل توزيعاته في أكاديمية حسوب من هنا. كما ستجد في هذه السلسلة (مدخل إلى لينكس) وهي سلسلة بسيطة تُعلمك أساسيات لينكس من الصفر. أيضًا يوجد كتاب دليل إدارة خواديم أوبنتو والذي يُعد من أشهر الكتب العربية في شرح لينكس، الكتاب يشرح إستخدام لينكس بشكل رئيسي، ولكن يمكن تعلم الكثير منه عن لينكس نفسه.
  6. لم تكن لغة PHP تدعم فكرة الأصناف المجهولة Anonymous classes في الماضي ولكن بداية من الإصدار 7 تم إضافة هذا المصطلح إلى اللغة وأصبح بإمكانك أن تقوم بهذا الأمر بشكل بسيط من خلال إستخدام الكلمة المفتاحية new و عمل صنف class بدون اسم على النحو التالي: new class { public function log($msg) { echo $msg; } } ويمكن تخزين الصنف في متغير أيضًا: <?php class Foo {} $child = new class extends Foo {}; var_dump($child instanceof Foo); // true تكون الأصناف المجهولة Anonymous classes مفيدة عندما يلزم إنشاء كائنات بسيطة لمرة واحدة وبشكل سريع.
  7. تدعم لغة PHP المعامل instanceof والذي يسمح لك بالتأكد من أن كائن معين عبارة عن مثيل instance من صنف معين أو يستخدم واجهة معينة interface، ويمكن إستخدامه كما يلي: <?php interface IUser { // ... } class MyClass implements IUser { // ... } $obj = new MyClass(); if ($obj instanceof IUser) { echo "obj implements IUser\n"; } if ($obj instanceof MyClass) { echo "obj is instance of MyClass"; } /* Output: obj implements IUser obj is instance of MyClass */ أيضًا يمكنك إستخدام الدالة class_implements والتي تسمح بمعرفة الواجهات التي يستعملها الصنف: $obj = new MyClass(); print_r(class_implements('MyClass')); /* Output: Array ( [IUser] => IUser ) */ وبالتالي يمكن إستخدام هذه الطريقة للتحقق من أن الصنف يستخدم واجهة معينة من خلال isset كما يلي: $obj = new MyClass(); $interfaces = class_implements('MyClass'); if (isset($interfaces['IUser'])) { echo "obj implements IUser"; } مع العلم أن الطريقة الأولى (المعامل instanceof) أسرع في الأداء من الطريقة الثانية (الدالة class_implements).
  8. في إصدار جافاسكريبت ECMAScript 2015 (المعروفة بـ ES6) تم دعم صيغة الصنف class-syntax لعمل أصناف جديدة ولكن لم يتم تقديم أي صيغة لعمل أصناف مجردة، ولكن بالرغم من ذلك إلا أنه يمكن عمل أصناف مجرد بمساعدة الكلمة المفتاحية new على النحو التالي: class AbstractUser { constructor () { if (new.target === AbstractUser) throw TypeError("Cannot instantiate abstract class AbstractUser"); } } وفي الدالة البانية يمكن إستخدام نفس الطريقة كما يلي: function AbstractUser() { if (this.constructor === AbstractUser) throw new Error("Cannot instantiate abstract class AbstractUser"); } وعند محاولة عمل نسخة جديدة من الصنف AbstractUser سيظهر خطأ: new AbstractUser(); // Error: Uncaught TypeError: Cannot instantiate abstract class AbstractUser في حالة كنت تستعمل TypeScript فيمكنك عمل صنف مجرد abstract class بشكل بسيط مثل أغلب لغات البرمجة المعروفة من خلال الكلمة المفتاحية abstract على النحو التالي: abstract class AbstractUser { name: string; constructor(name: string) { this.name = name; } }
  9. لا مشكلة في إستعمال Python في تطوير المواقع، ولكن يتم ذلك في جهة الخادم Server-side وليس في جهة العميل Client-side، فأي موقع من المواقع يتضمن على جزئين أساسيين، الجزء الأول هو واجهة الموقع Frontend والذي يحتوي على كل العناصر المرئية مثل النصوص والصور والأزرار .. إلخ، ويمكن جعل هذا الجزء تفاعلي من خلال إستخدام لغة JavaScript، وما يقصد هنا بجعل الموقع تفاعلي هو إظهار أو إخفاء أو تغير أجزاء من الموقع عند القيام بحدث ما، مثلًا يضغط المستخدم على أيقونة البحث فيظهر له صندوق للبحث في منتصف الشاشة أو يقوم المستخدم بالضغط على أيقونة الإشعارات فتظهر له كل الإشعار في نفس الصفحة .. إلخ. أما الجزء الثاني من الموقع هو الجزء الموجود على الخادم Backend والذي يختص بالتعامل مع قواعد البيانات وإدارة المستخدمين، ويمكن تطوير هذا الجزء بأي لغة من لغات البرمجة المعروفة، ولكن أشهر اللغات في هذا المجال هي PHP و Python و Ruby و JavaScript (مع Node.js) و Java و #C ، ويمكن إستخدام أي نوع من قواعد البيانات (أو أكثر من نوع في وقت واحد) مثل MySQL أو PostgreSQL أو MongoDB ..إلخ. أي أن الجزء الخلفي من المواقع Backend يختص بالتعامل المنطقي مع البيانات والخوادم، بينما الجزء الأمامي Frontend مهمته عرض هذه البيانات والتفاعل مع المستخدم بشكل مباشر. ستجد في هذه المقالة مقارنة مفصلة بين ثلاثة من لغات البرمجة المستعملة في تطوير الواجهة الخلفية Backend للمواقع: ملاحظة: ظهرت مؤخرًا مكتبة py-script والتي تسمح لك بإستخدام Python في الواجهة الأمامية Frontend، ولكنها مازالت تحت التطوير وأمامها الكثير من الوقت لتصل لمرحلة يمكن إستخدامها بشكل مستقر في مواقع الويب، هنا بعض الأمثلة البسيطة لإستخدامات هذه المكتبة. أيضًا ستجد في هذه المقالة شرح لأشهر التقنيات المستخدم في كلٍ من الواجهات الأمامية Frontend والواجهات الخلفية backend بما في ذلك Python:
  10. يوجد العديد من الطرق التي تُمكنك من نسخ clone كائن بالكامل، من ضمن هذه الطرق: إستخدام JSON const clone = JSON.parse(JSON.stringify(myObj)); تفي هذه الطريقة بالغرض عند التعامل مع الكائنات البسيطة (التي لا تحتوي على توابع Methods)، ولكن سيظهر خطأ TypeError إذا كان الكائن myObj يحتوي على أي توابع Methods. طريقة Shallow Copy const shallowClone = { ...myObj }; تقوم هذه الطريقة بعمل نسخة سطحية من الكائن وتخزينها في المتغير الجديد، ولكن ستظل كل التوابع والخصائص تُشير إلى نفس الكائنات بدون تغير. إستعمال مكتبة jQuery مثل مكتبة lodash توفر jQuery التابع extend والذي يقوم بنسخ الكائن بشكل كامل أيضًا: var clone = $.extend(true, {}, myObj); ستعمال مكتبة Lodash توفر مكتبة lodash الكثير من التوابع للتعامل مع الكائنات بشكل عام، ومن ضمن هذه التوابع يوجد التابع clone والذي يوفر إمكانية نسخ كائن بالكامل بطريقة سهلة وبسيطة: var clone = _.clone(myObj); لا يوجد فرق بين طريقة shallow clone السابقة والتابع clone، ولكن توفر lodash أيضًا تابع باسم cloneDeep والذي يقوم بنسخ الكائن بالكامل وليس مجرد نسخ سطحي: var clone = _.cloneDeep(myObj);
  11. وعليكم السلام ورحمة الله وبركاته من الجيد جدًا أنك لا تريد تخطي أي نقاط بدون فهما بشكل كامل، وتريد تعلم كل ما تحتويه الدروس بشكل جيد، وهذا الأمر من صفات المبرمج البارع. أعتقد أن المشكلة لديك في عدم تحديد هدف واضح وصريح، فالبرمجة متشعبة للغاية وتحتوي على العديد من الفروع والأقسام ومن الصعب للغاية أن يتعلم شخص واحد كل الفروع، في الواقع من الصعب حتى تجربة كل فروع البرمجة بشكل متأنٍ تجربة شاملة، لذلك يجب في البداية تحديد هدف واضح، هل تريد أن تكون مطور واجهات أمامية Frontend Developer؟ أم تريد أن تكون مبرمج واجهات خلفية Backend Developer؟ أم تريد أن تجمع بينه المجالين معًا لتصبح مطور شامل Full-stack Developer؟ بناءً على إجابة هذا السؤال ستحدد ما الذي عليك تعلمه بشكل متعمق وما الذي تحتاج إلى الإطلاع عليه فقط ولا تحتاج إلى دراستها بشكل مفصل. بما أنك إشترك في دورة PHP الخاصة بالأكاديمية فأتوقع أنك تريد أن تصبح أما مبرمج واجهات خلفية Backend Developer أو مبرمج شامل Full-stack Developer، في الحالة الأولى ليس عليك الإهتمام بأمور التنسيق مثل CSS و SCSS و Tailwind وغيرها من الأمور، يكفي فقط أن الإطلاع على هذه التقنيات إطلاعًا بسيطًا يساعدك على تخيل كيف يتم إنشاء باقي الموقع في جزء الوجهة الأمامية Frontend، وأنا لا أقصد أن تعلم هذه التقنيات ليس مفيدًا بل أقصد أن التركيز على تقنيات الوجهات الخلفية Backend والخوادم Server وقواعد البيانات Databases له الأولوية ومن الأفضل تعلم تقنيات مجالك على التنقل بين تنقيات مجال مختلف بدون فائدة مرجوة وواضحة منها. أما إن كان هدفك هو أن تصبح مبرمج شامل Full-stack Developer فحينها سيختلف الأمر كثيرًا لأنك يجب أن تتعلم التقنيات الموجودة في المجالين (Frontend + Backend)، وفي هذه الحالة يجب أن تدرس CSS و SCSS و Tailwind CSS و Bootstrap وغيرها من التقنيات لأنها جزء لا يتجزء من عملك كمطور شامل، بالطبع مع تعلم تقنيات الواجهات الخلفية Backend كذلك. في العادة يتعلم الشخص الذي يهدف إلى أن يصبح مطور شامل تقنيات الواجهات الأمامية Frontend، لأنها أسهل وترى نتيجة الكود الخاص بك بشكل مباشر في المتصفح، مما يعغطية دفعة معنوية ويساعدة على إكمال رحلته في تعلم البرمجة، على عكس تقنيات الواجهات الخلفية التي لا تحتوي على أي تأثيرات أو ألوان وفي الغالب تكون تعامل مع الكود المنطقي وقواعد البيانات فقط، ولكن بما أنك تعلمت أساسيات PHP وقواعد البيانات وكذلك إطار عمل مثل Laravel بالإضافة إلى إدراكك كيفية إستخدام HTML و CSS ولو بشكل بسيط، فمتاح لك الآن أما أن تكمل بتعلم تقنيات الواجهات الأمامية Frontend أو تقنيات الواجهات الخلفية Backend ولن تواجهة مشكلة في فهم أي منهما لأن لديك بالفعل فكرة واضحة عن التقنيات المستخدم في كلا المجالين. لاحظ أيضًا أن لغات مثل CSS و JavaScript هي لغات ضخمة وتحتوي على العشرات والمئات من الخصائص والكائنات والكثير من الأمور التي يجب تعلمها، وهذا الأمر سيستغرق منك الكثير من الوقت، ولهذا السبب أنصحك أن تتعلم CSS بجانب دراسة دورة PHP التي إشتركت بها، ويمكنك خلال تطبيق الدروس أن تستخدم CSS للتدريب عليها، وبهذا تستفيد من كلا الجانبين. بما أنك مشترك في دورات حسوب فستجد أن المسار الأول من كل دورة متاح لك ويمكنك الإطلاع عليه، وأنصحك أن تستغل هذه الفرصة وتقوم بالإطلاع على المسار الأول من دورة تطوير واجهات المستخدم Frontend لتدرس CSS و Bootstrap و jQuery بشكل جيد وتقوم بعمل موقع شخصي بسيط من الصفر بإستخدام هذه التقنيات. بعد إتمام هذا المسار تستطيع الإطلاع على Tailwind CSS من خلال التوثيق الرسمي له، ولن تواجهة مشاكل في فهم كيفية إستخدامه في مشاريعك، كما ستفهم أكثر ما هي أصناف Tailwind التي يضيفها المدرب ضمن مشاريع Laravel في دورة PHP. ليكون الأمر أكثر وضوحًا، ستجد هنا مجموعة من الخطوات المتسلسلة التي يمكنك إتباعها لتعلم ما ينقصك لتصبح مبرمج شامل Full-stack Developer: تابع المسار الأول ضمن دورة تطوير واجهات المستخدم Frontend، ستتعلم في هذا المسار أساسيات CSS و Bootstrap و jQuery بشكل جيد وتقوم بعمل موقع شخصي بسيط من الصفر بإستخدام هذه التقنيات. أقرأ توثيق Tailwind CSS بعناية وحاول أن تستخدمه ضمن المشاريع التي قمت بها سابقًا، وسيتجد ضمن توثيق Tailwind شرح كيفية إستخدامه من الصفر أو ضمن مشاريع Laravel أيضًا. تابع إكمال دورة تطوير الواجهات الخلفية بإستخدام PHP، وحاول أن تقوم بعمل جزء الواجهة الأمامية بنفسك دون الإطلاع على شرح المدرب، لتتدرب على CSS و Tailwind معًا. بعد إكمال دورة تطوير الواجهات الخلفية بإستخدام PHP، حاول أن تقوم بالإطلاع على دورة تطوير التطبيقات بإستخدام JavaScript لأنها تحتوي على الكثير من الأمور المفيدة لك مثل Node.js و React.js و MongoDB .. إلخ. الآن ستكون قد أتمت رحلة التعلم، ولكن البرمجة لا تتوقف وستجد في كل يوم تحديثات كثيرة لكل التقنيات التي تستخدمها، حاول أن تبقى على إطلاع بالمواقع التقنية وتحديثات حسوب وكذلك المقالات التي يتم نشرها ضمن الأكاديمية. الخطوات السابقة ليست إجبارية ويمكنك أن تقوم بتعديلها لتتوافق مع أهدافك وظروفك الشخصية كما تشاء.
  12. يمكن القيام بهذا الأمر بطريقة سهلة من خلال الكلمة المفتاحية super والتي تُستخدم للإشارة إلى الصنف الأب Parent Class على النحو التالي: class User { showAll() { console.log('showAll method from User class'); } } class Admin extends User { showAll() { super.showAll(); console.log('showAll method from Admin class'); } } الآن يمكن عمل كائن من الصنف Admin وإستدعاء التابع showAll: const admin = new Admin(); admin.showAll(); /* Output: showAll method from User class showAll method from Admin class */ ملاحظة: إن كان التابع showAll الموجود في الصنف User عبارة عن تابع ساكن Static Method فيجب أن يتم إستدعائه عبر تابع ساكن أيضًا، على النحو التالي: class User { static showAll() { console.log('showAll method from User class'); } } class Admin extends User { static showAll() { super.showAll(); console.log('showAll method from Admin class'); } } Admin.showAll(); /* Output: showAll method from User class showAll method from Admin class */
  13. يمكن عمل هذا الأمر بشكل بسيط للغاية في PHP، فكل ما عليك فعله هو إرجاع نفس الكائن في نهاية كل تابع: على سبيل المثال إن كان لدينا الصنف التالي: <?php class MyClass { public function doSomething() { // ... } public function doSomethingElse() { // ... } } يجب فقط إرجاع نفس الكائن في نهاية كل تابع عبر الكلمة this$: <?php class MyClass { public function doSomething() { // ... return $this; } public function doSomethingElse() { // ... return $this; } } بهذا الشكل يمكن إستخدام التوابع كما يلي: $obj = new MyClass(); $obj->doSomething()->doSomethingElse(); لاحظ أن هذه الطريقة لا يمكن عملها إن كان يجب إرجاع شيء مُحدد من أحد التوابع.
  14. يمكنك أن تستخدم الأقواس المعقوفة { } للوصول إلى الخاصية content على النحو التالي: <?php class MyObject { public $content = "hello"; } $obj = new MyObject(); $obj->property_name = 'content'; $result = $obj->{$obj->property_name}; echo $result; // hello ليس عليك حتى تخزين اسم الخاصية content في خاصية أخرى property_name ويمكنك إستخدام المتغيرات مباشرة: <?php class MyObject { public $content = "hello"; } $obj = new MyObject(); $name = 'content'; $result = $obj->$name; echo $result; // hello
  15. بالفعل، يوجد إختلاف بين الطريقتين، الطريقة الأولى تستخدم لإضافة تابع صنف class method بينما الطريقة الثانية تستخدم لإضافة تابع نسخة (تابع مثيل) instance method. class User {} User.classMethod = function () { /* ... */ } User.prototype.instanceMethod = function () { /* ... */ } const user1 = new User(); user1.classMethod(); // TypeError: user1.classMethod is not a function User.classMethod(); // correct user1.instanceMethod(); // correct طريقة classMethod في المثال السابق تقوم بإضافة تابع إلى الصنف نفسه وليس إلى الكائنات التي يتم إنشائها من هذا الصنف (user1)، ويمكن تخيلها أنا عبارة عن تابع ساكن static method ، وكان يتم إستعمال هذه الطريقة في ES5 وما قبله من إصدارات، بينما في ES6 تم إضافة الكلمة المفتاحية static لإضافة توابع ساكنة Static Methods إلى الصنف مباشرة: class User { static classMethod () { /* التوابع الساكنة لا يمكنها إستخدام this */ } instanceMethod () { /* يمكن إستخدام this هنا للتعبير عن الكائن object */ } } const user1 = new User(); user1.classMethod(); // TypeError: user1.classMethod is not a function User.classMethod(); // correct user1.instanceMethod(); // correct لمعرفة المزيد عن التوابع الساكنة Static Method والفرق بينها وبين التوابع العادية instance Method أطلع على هذه الإجابة هنا:
  16. يوجد العديد من الأدوات التي تساعدك في الحصول على ألوان متناسقة لإستعمالها في أي نوع من التصاميم، هنا بعض هذه الأدوات: color mind mycolor space colorhunt coolors كما دوجد بعض الأدوات التي تسمح لك برفع صورة وإستخراج نمط الألوان منها مثل أداة image-picker من coolors، وتوجد أداوت تساعدك في مقارنة الأوان وحساب نسبة التباين بين الأوان مثل أداة contrast-checker التي تعرض لك رقم ما بين 1 و 21، تستخدم هذه الأداة لكي تعرف الأوان الصحيحة التي يجب إستخدامها في النصوص والخلفيات. كما توجد أدوات تسمح لك بإضافة لون معين وتعرض عليك بعد ذلك مجموعة من الألوان المتناسقة مع اللون الذي أدخلته، بالإضافة إلى مجموعة واسعة من تدرجات هذا اللون، بعض الأمثلة: colorhexa paletton في هذه المقالة المقدمة من موقع مستقل ستجد شرح لأشهر الألوان ومتى تستخدم كل لون، وبالرغم من أن المقالة تتحدث عن الهوية البصرية بشكل أساسي إلا أن المعلومات التي تحتويها تصلح كذلك في تصميم المواقع والتطبيقات: كيف تختار ألوان الهوية البصرية التي تناسب علامتك التجارية؟
  17. توفر لغة JavaScript العديد من الطرق التي تُمكنك من التأكد من نوع كائن Object معين، هنا بعضها: إستخدام typeof تستخدم هذه الطريقة للتأكد من أن متغير ما عبارة عن كائن Object من صنف آخر: class User {} const user1 = new User(); typeof User; // 'function' typeof user1; // 'object' إستخدام instanceof توفر هذه الطريقة إمكانية التأكد من أن كائن Object معين عبارة عن نسخة instance من صنف ما: user1 instanceof User; // true user1 instanceof Array; // false التابع isPrototypeOf بما أن لغة JavaScript تعتمد بشكل أساسي على prototype، فيمكننا إستخدام التابع isPrototypeOf للتأكد من أن كائن ما عبارة عن نسخة من صنف معين: User.prototype.isPrototypeOf(user1); // true إستخدام constructor.name هذه طريقة مختلفة لأداء نفس مهمة instanceof السابقة: user1.constructor.name === "User"; // true ملاحظة: لا يًفصل إستعمال هذه الطريقة إذا كنت تستعمل أدوات مثل Uglify أو minify التي تغير أسماء الأصناف لتصبح أقصر، لكن يمكن في هذه الحالة إستخدام المقارنة المباشرة باسم الصنف class بدون مشكلة على النحو التالي: user1.constructor.name; // == "User" User.name; // User user1.constructor.name === User.name; // true
  18. لا يوجد خطأ برمجي في الكود المرفق، ولكن ربما التدريب الذي تحاول حله يطلب منك شيء آخر غير طباعة hello world، وربما سبب المشكلة في المسافة الإضافية في جملة hello world ، لاحظ: #include <iostream> #include <string> int main() { std::cout << "hello world "; // ^^ } حاول أن تجعل جملة hello world نفس الشكل المطلوب، وبنفس حالة الأحرف (Capital - Small). وقد تكون هذه مشكلة ضمن الموقع الذي تتدرب عليه كذلك.
  19. في كثير من الأحيان يتأخر صاحب العمل عن إستلام المشروع، وذلك يرجع لعدد كبير من الأسباب، وفي الغالب تكون أسباب شخصية. لكن لا تقلق فحقك كمستقل إنتهى من تنفيذ المشروع وتسليمه مضمون إن شاء الله. حاول التواصل مع مركز المساعدة الخاص بموقع مستقل من هنا، وسوف يساعدك في حل هذه المشكلة.
  20. إن كنت تقصد دورة تطوير واجهات المستخدم فهي دورة خاصة بـ Frontend فقط، وستتخرج منها وأنت مطور واجهات أمامية Frontend، ولكن يوجد دورات أخرى في أكاديمية حسوب تُعلم تطوير الواجهات الخلفية (دورة خاصة بلغة PHP ودورة خاصة بلغة Ruby ودورة خاصة بلغة Python ودورة بلغة JavaScript)، كل هذه الدورات يتم شرح أساسيات الواجهات الخلفية والعديد من الأمور المتقدمة في هذا المجال، وبالتأكيد كل هذه الدورات تحتوي على العديد من المشاريع الشاملة. تستطيع الإطلاع على هذه الإجابة لمعرفة كل تفاصيل هذه الدورات:
  21. يمكنك كذلك إستخدام الدالة get_parent_class، حيث تمكنك الدالة get_parent_class من معرفة الصنف الأب لأي صنف آخر (بما في ذلك الصنف الحالي عبر this$)، ومع إستخدام الصنف ReflectionMethod يمكنك تنفيذ التابع الباني constructor على النحو التالي: <?php class GrandFather { public function __construct() { echo "GrandFather's constructor \n"; } } class Father extends GrandFather { public function __construct() { // call GrandFather's constructor parent::__construct(); } } class Son extends Father { public function __construct() { $grandpa = get_parent_class(get_parent_class($this)); $reflectionMethod = new ReflectionMethod($grandpa, '__construct'); // calling grandFather constructor $reflectionMethod->invoke($this); echo "calling the constructor from " . $grandpa . " Class"; } } $son = new Son(); /* Output: GrandFather's constructor calling the constructor from GrandFather Class */ توثيق الدالة get_parent_class في موسوعة حسوب.
  22. في مستودعات GitHub يسمح لك بإستخدام عناصر HTML الأساسية مثل إضافة الروابط والصور والعناوين Headings كذلك، هنا مثال لإستخدام HTML لإضافة صورة: # About This Repo <img src="https://www.google.com/images/branding/googlelogo/2x/googlelogo_light_color_92x30dp.png" alt="Some Content"> ويمكنك حتى إضافة الصورة داخل رابط بدون مشكلة: # About This Repo <a href="https://google.com"> <img src="https://www.google.com/images/branding/googlelogo/2x/googlelogo_light_color_92x30dp.png"> </a>
  23. لفهم المدخل thisArg يجب أولًا فهم معنى this في لغة JavaScript، تخيل أن لدينا الكائن التالي: let user = { name: 'username', age: '32' }; الكائن السابق عبارة عن مجموعة من المفاتيح keys والقيم values ، وبفرض أننا نريد أن نقوم بطباعة كل القيم Value فسوف نستعمل التابع keys للحصول على مصفوفة من المفاتيح، ونستخدمها لطباعة القيم: Object.keys( user ).forEach(function( key ) { console.log( user[key] ); }); /* Output: username 32 */ أغلب توابع المصفوفات تستقبل مدخل أول وهو دالة callback ، والمدخل الآخر هو thisArg ويُعبر عن قيمة this داخل دالة callback: Object.keys( user ).forEach(function( key ) { console.log( this[key] ); }, user); // نُعين قيمة thisArg /* Output: username 32 */ بشكل إفتراضي this تُشير إلى الكائن window في المتصفح، ولكن عندما نستخدم thisArg فإن قيمة this تتغير إلى قيمة المدخل thisArg console.log(this); // window هنا شرح مفصل لمعنى this في لغة JavaScript في موسوعة حسوب.
  24. يمكن عمل لنموذج Model بسيط يعبر عن جدول معين في أي لغة برمجة، ولكن في البداية يجب أن تقوم بعمل صنف Class للإتصال بقاعدة البيانات والتعامل معها بالشكل التالي: class Database { protected $conn; public function __construct($connection) { $this->conn = $connection; } public function ExecuteQuery($sql, $data) { // ... } } الصنف السابق يأخذ مدخل واحد وهو إتصال بقاعدة البيانات ويمكننا إستخدامه بالشكل التالي: $conn = new PDO("mysql:host=localhost;dbname=myDB", "username", "password"); $db = new Database($conn); الآن يمكن إستعمال التابع ExecuteQuery لتنفيذ جمل SQL مباشرة في قاعدة التي إتصلنا بها. نحتاج الآن إلى عمل صنف مجرد abstract class يُعبر عن النموذج الواحد Model، بحيث يمكننا عمل أي عدد من النماذج Models كما نريد: abstract class Model { protected $db; public function __construct(Database $db) { $this->db = $db; } // ... } يمكننا الآن عمل نموذج Model يعبر عن المستخدم أو منشور ما .. إلخ: class User extends Model { protected $table = "users"; public function save() { // ... $sql = "INSERT INTO " . $this->table . " VALUE ..."; return $this->db->ExecuteQuery($sql, $data); } } وتستطيع إستخدام هذا النموذج على النحو التالي: $db = new Database($conn); $user = new User($db); $user->name('username'); $user->email('user@gmail.com'); $user->save(); الكود السابق ما هو إلا تجريد لجدول users في قاعدة البيانات، ولكن النموذج من المفترض أن المستخدم الواحد وليس جدول المستخدمين، لذلك يجب أن تقوم بإضافة بعض التوابع حسب حاجتك لإتمام عمليات أخرى مثل جلب بيانات مستخدم معين من قاعدة البيانات عبر id أو تعديل هذه البيانات لاحقًا .. إلخ. ملاحظة: كل الكود السابق يمكن تطبيقه بعدة طرق مختلفة، ولكن ستحصل على نفس النتيجة في النهاية وهي وجود نموذج يعبر عن كائن معين (مستخدم، تعليق، منشور .. إلخ)، لذلك عليك أن تقوم بتعديل الكود السابق حسب رغبتك وإحتياجاتك.
  25. الكود عبارة عن دالة reverse أي أنها تقوم بعكس ترتيب العناصر في مصفوفة معينة، على النحو التالي: const arr = [1, 2, 3, 4, 5]; const reverse = (array) => array.map(array.pop, [... array]); const reversedArr = reverse(arr); console.log(reversedArr); // [5, 4, 3, 2, 1] يمكن تبسيط الكود أكثر ليسهل فهمه من خلال إستعمال دالة عادية بدلًا من دالة سهمية Arrow Function: const arr = [1, 2, 3, 4, 5]; function reverse(array) { var ret = new Array; for(var i = array.length-1; i >= 0; i--) { ret.push(array[i]); } return ret; } const reversedArr = reverse(arr); console.log(reversedArr); // [5, 4, 3, 2, 1] التابع map يقوم بالمرور على عناصر المصفوفة وتنفيذ دالة Function على كل عنصر من عناصر هذه المصفوفة، هنا توثيق هذا التابع في موسوعة حسوب. const arr = [1, 2, 3, 4, 5]; arr.map((item) => {console.log(item)}); /* Output: 1 2 3 4 5 */ بينما التابع pop يقوم بحذف آخر عنصر من المصفوفة، مثال: const arr = [1, 2, 3, 4, 5]; const lastItem = arr.pop(); console.log(arr); // [1, 2, 3, 4] console.log(lastItem); // 5 تجد في هذه المقالة شرح لهذه التوابع وغيرها بشكل مفصل:
×
×
  • أضف...